C++ 如果调用new和delete,管理dll类的内存是否安全?

C++ 如果调用new和delete,管理dll类的内存是否安全?,c++,C++,如果我的DLL有我的一个类的实现,如果我对它执行新建和删除,可以吗?关于DLL的问题是什么时候?谁分配什么 如果那个类调用new呢 class InDLL { A* something; InDLL() { something = new A; } }; ... //me InDLL dll = new InDLL(); //problem? 谢谢你所做的一切都不是问题。但是,在跨DLL边界传递用new分配的

如果我的DLL有我的一个类的实现,如果我对它执行新建和删除,可以吗?关于DLL的问题是什么时候?谁分配什么

如果那个类调用new呢

    class InDLL {
    A* something;

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

    ...

    //me

InDLL dll = new InDLL(); //problem?

谢谢你所做的一切都不是问题。但是,在跨DLL边界传递用
new
分配的对象时会遇到问题,因为调用方可能会对
new
使用与您使用的不同的分配器。

一条重要规则是分配内存的人负责释放该内存,使用相同的分配器。内存的分配方式没有限制(可以通过主可执行文件、DLL或其他DLL进行分配),但一旦分配,同一模块必须释放内存

需要记住这一点的最重要实例是,如果DLL有一个导出函数,该函数返回指向新分配内存的指针。这样做时,还必须导出相应的函数以释放内存。例如:

// In mydll.dll:
class MyClass { ... };

MyClass * DLLEXPORT NewMyClass()
{
    return new MyClass;
}

void DLLEXPORT FreeMyClass(MyClass *obj)
{
    delete obj;
}
无法在一个模块中分配内存(例如,通过从主可执行文件调用上面的
NewMyClass()
),然后在另一个模块中释放内存(例如,主可执行文件):

原因是不同的模块可以(并且经常)链接到不同的、不兼容的C/C++运行库版本上。当这种情况发生时,不同的模块对堆的工作方式有不同的想法,它们的
malloc
/
free
operator new
/
operator delete
的实现可能不一致

有关更多信息,请参见

// 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!