我正在尝试使 DLL 文件与不同的编译器配置(调试、发布、..)兼容。为了确保以正确的方式删除对象,我设法编写了一个指针包装类,该类在我获取 DLL 的对象并超出范围时使用已编译的删除运算符。
我对此非常满意,但是当我尝试删除在同一方法/程序中分配的内存时,我的程序崩溃了。
以下是在标准发布模式下编译的一些示例代码:
标题
template <typename T>
class API mwCompatibleObject
{
public:
//! Constructor
mwCompatibleObject();
//! Destructor
virtual ~mwCompatibleObject();
};
源代码
template < typename T >
mwCompatibleObject< T >::mwCompatibleObject() {}
template <typename T>
mwCompatibleObject<T>::~mwCompatibleObject() {}
注意:API 定义为导出/导入。
现在我在调试模式应用程序中使用这个类,我在其中创建一个实例并立即删除它。
mwCompatibleObject<double> * obj = new mwCompatibleObject<double>();
delete obj;
在 mlock.c 第 376 行执行删除操作符会导致访问冲突。
这是调用堆栈的副本:
ntdll.dll!7721e3be()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
msvcr80d.dll!_unlock(int locknum=4) Line 376 C
msvcr80d.dll!_heap_alloc_dbg(unsigned int nSize=0, int nBlockUse=2968120, const char * szFileName=0x2e2ed26c, int nLine=1638180) Line 477 + 0x7 bytes C++
msvcr80d.dll!_heap_alloc_dbg(unsigned int nSize=0, int nBlockUse=2968120, const char * szFileName=0x2e2ed26c, int nLine=1638180) Line 474 + 0xc bytes C++
00300000()
msvcr80d.dll!malloc(unsigned int nSize=2968120) Line 154 + 0x15 bytes C++
5axutil.dll!100b5d09()
Integrator3.exe!main() Line 54 + 0x34 bytes C++
我不能跳到那行或任何东西,但我设法查看了汇编程序代码,这证明了我的观察,它与析构函数有关。
尝试使 DLL 兼容时,虚拟函数/析构函数是否存在一般问题?