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

标签 c++

如果我的 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/

相关文章:

c++ - 为什么这段代码会产生竞争条件?

c++ - 试图理解 strtok

c++ - 删除从嵌套包中找到的第一个指定类型

c++ - 标准库容器的通用函数模板

c++ - sscanf_s 无法从字符串中找到所有值

c++ - 为什么 GCC 6.3 在没有明确 C++11 支持的情况下编译这个 Braced-Init-List 代码?

c++ - 使用 std::locale 格式化法语数字时,UTF-8 数据无效

C++ : Potential Issues with Custom Coded Generic Container?

c++程序在输入时跳过行[控制台应用程序]

c++ - 将指针临时绑定(bind)到引用