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

jma*_*erx 3 c++

如果我的DLL有我的一个类的实现,如果我做新的并删除就可以了吗?什么是关于DLL的问题和谁分配什么?

如果那个班级叫新的怎么办?

    class InDLL {
    A* something;

    InDLL()
    {
       something = new A;
    }
    };

    ...

    //me

InDLL dll = new InDLL(); //problem?
Run Code Online (Sandbox Code Playgroud)

谢谢

Ada*_*eld 6

一个重要的规则是,分配内存的人负责使用相同的分配器释放该内存.对内存必须如何分配没有限制(它可以由主可执行文件,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/ freeoperator new/ operator delete可能不一致.

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