使用dll中的类时内存无效

时间:2011-09-01 20:53:15

标签: c++ windows visual-studio dll

这是我第一次尝试从dll导出类。 我所做的是:     - 创建一个接口(只有纯虚方法)     - 在dll中使用不会导出的类实现此接口     - 该类有一个release方法,在其this指针上调用delete     - 使用静态方法创建一个Factory类,该方法返回指向具体类的指针,但作为接口。这个类是导出的。      - 通过调用其释放方法来删除返回的对象。

我从本教程about classes in dlls中收集了所有这些内容。

问题是,当我在另一个项目中使用这个dll时,一切都会正常,直到我在对象上调用release函数。 然后它显示一个断言失败的窗口,其中包含消息“_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse));”

这是否发生在其他人身上? 我知道这就像忘记在启动C ++时使用std ::一样简单,但就像我说的那样,我刚刚开始使用它。

谢谢!

2 个答案:

答案 0 :(得分:4)

标题中是否定义了工厂功能?如果是,并且用于创建对象的new在标头中,则从DLL中调用delete会导致此错误。工厂函数需要由DLL导出,只有声明必须出现在标题中。

例如,您的标题应该显示为:

class MyInterface 
{
public:
  virtual void DoSomething() = 0;

  virtual ~MyInterface() {}
};

__declspec(dllexport) MyInterface * __stdcall MyInterfaceFactory();

MyInterfaceFactory()的实现必须包含在DLL中。

答案 1 :(得分:-1)

感谢您的回答,对不起,我一无所获!

问题非常简单,但隐藏在界面,工厂和其他一些东西背后。 我正在返回一个指向一个被声明为静态的对象的指针,因为它必须是一个单例。然后我试图释放这个对象。 BANG堆腐败!!

我的单例对象首先不应该有释放功能; 我将通过在单独的接口中提取释放函数来解决这个问题,该接口只能由非静态对象实现。