DLL导出类的析构函数执行有关问题
DLL导出类的析构函数执行问题
第一次写DLL导出类
.h
#ifndef _NIPID_FILE_
#define CLASS_DECLSPEC __declspec( dllimport )
#else
#define CLASS_DECLSPEC __declspec( dllexport )
#endif
class CLASS_DECLSPEC CNIPID
{
protected:
……
public:
CNIPID();
virtual ~CNIPID();
……
};
.cpp
CNIPID::CNIPID()
{
……
}
CNIPID::~CNIPID()
{
……
}
好了,编译通过,一切都貌似没问题,可在主程序
m_NIMotionCard = new CNIPID();
使用结束后
delete m_NIMotionCard;
完了,这个delete运行报错咧,大概就是失效位置无法访问的意思。
然后全力百度至
http://support.microsoft.com/kb/122675/zh-cn
大概理解了,要解决此问题,要么不用虚函数式的析构函数且必须内联;要使用虚函数式的析构函数则必须通过另两个变通的方法来实现。一个我看懂了,使用包装类;另一个我看得稀里糊涂……直接看英文原版说明,更加糊涂。
我想知道为什么会出现这种问题(文中有解释,我看不懂,尤其不知道什么是helper function,望解答)
------解决方案--------------------
DLL最好不要包装类, 存在潜在双重CRT资源泄露问题.
谨慎使用, 需要严格控制构造析构已经中间的内存分配释放也可以.
建议包装成普通struct结构类型(不存在构造析构), 已经配套的API形式作为成员函数来处理.
------解决方案--------------------
珍惜生命,远离dll导出类
------解决方案--------------------
I once used this kind of method, it works on visual studio.
------解决方案--------------------
DLL 提供Create 和Destory函数;
第一次写DLL导出类
.h
#ifndef _NIPID_FILE_
#define CLASS_DECLSPEC __declspec( dllimport )
#else
#define CLASS_DECLSPEC __declspec( dllexport )
#endif
class CLASS_DECLSPEC CNIPID
{
protected:
……
public:
CNIPID();
virtual ~CNIPID();
……
};
.cpp
CNIPID::CNIPID()
{
……
}
CNIPID::~CNIPID()
{
……
}
好了,编译通过,一切都貌似没问题,可在主程序
m_NIMotionCard = new CNIPID();
使用结束后
delete m_NIMotionCard;
完了,这个delete运行报错咧,大概就是失效位置无法访问的意思。
然后全力百度至
http://support.microsoft.com/kb/122675/zh-cn
大概理解了,要解决此问题,要么不用虚函数式的析构函数且必须内联;要使用虚函数式的析构函数则必须通过另两个变通的方法来实现。一个我看懂了,使用包装类;另一个我看得稀里糊涂……直接看英文原版说明,更加糊涂。
我想知道为什么会出现这种问题(文中有解释,我看不懂,尤其不知道什么是helper function,望解答)
------解决方案--------------------
DLL最好不要包装类, 存在潜在双重CRT资源泄露问题.
谨慎使用, 需要严格控制构造析构已经中间的内存分配释放也可以.
建议包装成普通struct结构类型(不存在构造析构), 已经配套的API形式作为成员函数来处理.
------解决方案--------------------
珍惜生命,远离dll导出类
------解决方案--------------------
I once used this kind of method, it works on visual studio.
------解决方案--------------------
DLL 提供Create 和Destory函数;