如果我的 DLL 具有我的其中一个类的实现,如果我对其进行新建和删除,可以吗?关于 DLL 和谁分配什么的问题何时出现?
如果那个类调用 new 怎么办?
class InDLL {
A* something;
InDLL()
{
something = new A;
}
};
...
//me
InDLL dll = new InDLL(); //problem?
谢谢
最佳答案
一个重要的规则是分配内存的人负责释放该内存,使用相同的分配器。对于必须如何分配内存没有限制(它可以由主可执行文件、您的 DLL 或其他一些 DLL 分配),但一旦分配,同一个模块必须释放它。
您需要记住这一点的最重要的实例是,如果您的 DLL 有一个返回指向新分配内存的指针的导出函数。当您这样做时,您还必须导出相应的函数以释放该内存。例如:
// In mydll.dll:
class MyClass { ... };
MyClass * DLLEXPORT NewMyClass()
{
return new MyClass;
}
void DLLEXPORT FreeMyClass(MyClass *obj)
{
delete obj;
}
您不能做的是在一个模块中分配内存(例如,通过从主可执行文件调用上面的 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!
原因是不同的模块可以(并且经常)链接到不同的、不兼容的 C/C++ 运行时库版本。当发生这种情况时,不同的模块对堆的工作方式以及它们对 malloc
的实现有不同的想法。/free
或 operator new
/operator delete
可能不同意。
有关详细信息,另请参阅 Allocating and freeing memory across module boundaries .
关于c++ - 如果我调用 new 和 delete,管理 dll 类的内存是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4543552/