[英]Is it safe for me to manage memory of a dll class if I call new and delete?
如果我的DLL有我的一个类的实现,如果我做新的并删除就可以了吗? 什么是关于DLL的问题和谁分配什么?
如果那个班级叫新的怎么办?
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
可能不一致。
有关更多信息,另请参阅跨模块边界分配和释放内存 。
你在做什么不是问题。 但是,您将无法通过DLL边界传递分配了new
对象的对象,因为调用者可能会使用与您使用的new
分配器不同的分配器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.