Linux上的单独堆

Separate Heap on Linux?

本文关键字:单独堆 Linux      更新时间:2023-10-16

在我的项目中,我有一些插件在运行时通过LoadLibrary()加载。从"Windows通过C/C++"一书中,我知道在DLL中创建的对象应该在DLL中释放。Object* CreateObj() void FreeObj(Object*)。原因是,可能有多个链接的C/C++运行时链接到正在运行的进程。

当我试图将我的项目移植到Linux时,我使用了同样的方法。但是:Linux也需要这样吗?Linux进程中是否也存在多个堆?

如果您的.so静态链接到C++运行时,您应该在分配对象的同一模块中释放对象,因为new/deletemalloc()/free()更重要,需要一些额外的信息才能正常工作。此外,您甚至不应该在.so模块之间传递特定于运行时的对象/指向对象(例如std::string)的指针,因为模块通常可能链接到不同的二进制不兼容的运行时实现(例如,您有一些第三方预构建模块)。即使在所有进程中使用相同的运行时实现,静态链接也会导致创建运行时内部全局的多个实例,这肯定会造成混乱。

所以,IMHO,最好的场景是将所有模块链接到运行时的动态版本。或者,如果您真的想使用静态链接的运行时,您必须为每个模块公开纯C接口,以避免上述干扰。

附言:这种行为并不取决于实际的系统,它与任何支持动态加载模块的东西有关。