gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:31:19 25 4
gpt4 key购买 nike

如果我的 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 的实现有不同的想法。/freeoperator new/operator delete可能不同意。

有关详细信息,另请参阅 Allocating and freeing memory across module boundaries .

关于c++ - 如果我调用 new 和 delete,管理 dll 类的内存是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4543552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com