Linux上的单独堆
Separate Heap on Linux?
在我的项目中,我有一些插件在运行时通过LoadLibrary()
加载。从"Windows通过C/C++"一书中,我知道在DLL中创建的对象应该在DLL中释放。Object* CreateObj()
void FreeObj(Object*)
。原因是,可能有多个链接的C/C++运行时链接到正在运行的进程。
当我试图将我的项目移植到Linux时,我使用了同样的方法。但是:Linux也需要这样吗?Linux进程中是否也存在多个堆?
如果您的.so
静态链接到C++运行时,您应该在分配对象的同一模块中释放对象,因为new/delete
比malloc()/free()
更重要,需要一些额外的信息才能正常工作。此外,您甚至不应该在.so
模块之间传递特定于运行时的对象/指向对象(例如std::string
)的指针,因为模块通常可能链接到不同的二进制不兼容的运行时实现(例如,您有一些第三方预构建模块)。即使在所有进程中使用相同的运行时实现,静态链接也会导致创建运行时内部全局的多个实例,这肯定会造成混乱。
所以,IMHO,最好的场景是将所有模块链接到运行时的动态版本。或者,如果您真的想使用静态链接的运行时,您必须为每个模块公开纯C接口,以避免上述干扰。
附言:这种行为并不取决于实际的系统,它与任何支持动态加载模块的东西有关。
相关文章:
- 分段故障(堆芯转储)矢量
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在C++中从两个单独的for循环中添加两个数组
- Linux的Cpp上的计时器
- 测量静态,堆和堆栈内存?(C ,Linux -CentOS 7)
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- 如何使用单独的 Linux 和 Windows 计算机的代码块开发C++项目?
- 如何在Linux中使用Makefile一次编译一堆测试C++文件
- 在两个单独的应用程序之间共享 dll 中的堆内存
- 如何在 Linux 中保护堆内存
- 如何在 Linux 中的单独/包含目录中编译额外/更新的库以及新程序
- 如何将 "kill -3 <jvm pid>" 标准输出单独重定向到 linux 和 unix 中的文件?
- 构造一个c++linux程序.何时分解单独的文件与单独的程序
- 在GCC linux中编译时的一堆错误和警告
- Linux上的单独堆
- 在32位linux内核上使用c++在堆上分配超过2GB的空间
- 在Windows上堆损坏,而不是Linux上的堆损坏
- 共享库和可执行文件与 Linux 上的静态 C 运行时链接.它们中的每一个都有像Windows这样的独立堆吗?
- 使用pThreads创建和管理单独的堆
- 堆栈和堆地址区域在Windows和linux中是不同的