DLL导出类,在EXE中调用delete时非法操作

    技术2022-05-11  96

    现象:   在Exe中使用由动态库导出的类,在delete时非法操作。有其他模块(DLL或EXE)调用都非法。   程序如下:   EXE app.cpp   #include "stdafx.h" #include "../Appdll/AppDll.h" int main(int argc, char* argv[]) {  HpTest * p = new HpTest();  delete p; return 0; }   DLL库 AppDll.h #define DLLEXPORT __declspec(dllexport) class DLLEXPORT HpTest{ public :  HpTest();  virtual~HpTest(); };   Appdll.cpp HpTest::HpTest() {             } HpTest::~HpTest() { } 运行出错误   原因:由于类的析构被定义为虚函数,在进行类的析构后,在动态库内执行了delete操作。可参照此文章: http://support.microsoft.com/kb/122675/zh-cn。析构函数如果为非虚的,则不会有此现象   解决方法: 1.在类内重载new和delete操作符。 class DLLEXPORT HpTest{ public :             HpTest();             virtual~HpTest();             void* operator new(size_t);             void operator delete(void*);   }; void* HpTest:: operator new(size_t size) {             return malloc(size); } void HpTest:: operator delete(void *p) {             free(p); } 2.使用dllimport a 动态库中实现类,指定 _declspec(dllexport)。 b. Exe使用类时指定 _declspec(dllimport)。 c. 使用虚拟析构   #ifdef _DLL    #define DLLEXP __declspec(dllexport)    #else    #define DLLEXP __declspec(dllimport)    #endif   class DLLEXP HpTest { …… }; DLL的工程内定义宏_DLL. 3.其他方法,参看参照文章即可。  

    最新回复(0)