Linux C/C++ 在动态库中分配/释放内存

Dej*_*jwi 4 c c++ linux allocation dynamic-library

我必须将我的应用程序拆分为几个逻辑模块。

mainapp

  • module1.so
  • module2.so
  • module3.so
  • 等等

每个模块都是一个*.so库,将在运行时加载。

每个模块共享相同的接口并返回一些数据数组。例如:

int *ptr = module1->getIntData();

可以在mainapp一边释放/删除此内存吗?

int *ptr = module1->getIntData();
delete ptr; //(or free(ptr))
Run Code Online (Sandbox Code Playgroud)

malloc/free 实现怎么样。有没有可能,那个库会使用另一个然后是 mainapp?

Mar*_*ica 5

我强烈建议进行分配的模块也负责进行取消分配。因此:

int *ptr = module1->getIntData();
...
module1->freeIntData(ptr);
Run Code Online (Sandbox Code Playgroud)

这允许不同的模块轻松使用不同的分配器(malloc/free、new/delete、slab 分配器等)。

在 Posix 系统上,一个进程中只能有malloc(and free) 的一个实现,所以如果定义getIntData是“返回一个必须被释放的指针free”,那么你会没事的。另一方面,我认为可以编写两个 C++ 编译器,它们可用于编写 module1 和 module2,但不能 delete由另一个new. (虽然我认为目前不存在这样的编译器)。

如果有一丝一毫的机会,您可能不得不将这批产品移植到 Windows,那么您真的希望模块释放它们分配的内存。不同的 DLL 可以有不同的堆,各种有趣的问题都会随之而来。(正如@trojanfoe 在评论中所说:仅调试版本和发布版本之间的差异就足以引起悲伤。)

std::unique_ptr如果您可以保证所有模块始终使用相同编译器标志的相同编译器的相同版本构建,我只会推荐使用。(我坚信保持动态库接口尽可能简单和 C 风格。)