如果我的DLL有我的一个类的实现,如果我做新的并删除就可以了吗?什么是关于DLL的问题和谁分配什么?
如果那个班级叫新的怎么办?
class InDLL {
A* something;
InDLL()
{
something = new A;
}
};
...
//me
InDLL dll = new InDLL(); //problem?
Run Code Online (Sandbox Code Playgroud)
谢谢
一个重要的规则是,分配内存的人负责使用相同的分配器释放该内存.对内存必须如何分配没有限制(它可以由主可执行文件,DLL或其他DLL分配),但一旦分配,相同的模块必须释放它.
您需要记住这一点的最重要的实例是,如果您的DLL具有导出的函数,该函数返回指向新分配的内存的指针.执行此操作时,还必须导出相应的函数以释放该内存.例如:
// In mydll.dll:
class MyClass { ... };
MyClass * DLLEXPORT NewMyClass()
{
return new MyClass;
}
void DLLEXPORT FreeMyClass(MyClass *obj)
{
delete obj;
}
Run Code Online (Sandbox Code Playgroud)
您不能做的是在一个模块中分配内存(例如,通过NewMyClass()从主可执行文件调用上面的内容)并将其释放到另一个模块中(例如主可执行文件):
// THIS CODE IS BUGGY, DO NOT USE:
HMODULE mydll = LoadLibrary("mydll.dll");
MyClass (*NewMyClass)() = (MyClass (*)())GetProcAddress(mydll, "NewMyClass");
MyClass *obj = NewMyClass(); // allocate inside DLL
...
delete obj; // BOOM!
Run Code Online (Sandbox Code Playgroud)
这样做的原因是不同的模块可以(并经常)链接到C/C++运行时库的不同,不兼容的版本.当发生这种情况时,不同的模块对堆的工作方式有不同的想法,并且它们的实现malloc/ free或operator new/ operator delete可能不一致.
有关更多信息,另请参阅跨模块边界分配和释放内存.