繁体   English   中英

如果我调用new并删除,我可以安全地管理dll类的内存吗?

[英]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 / freeoperator new / operator delete可能不一致。

有关更多信息,另请参阅跨模块边界分配和释放内存

你在做什么不是问题。 但是,您将无法通过DLL边界传递分配了new对象的对象,因为调用者可能会使用与您使用的new分配器不同的分配器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM