繁体   English   中英

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

[英]Linux C/C++ allocate/deallocate memory in dynamic library

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

mainapp

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

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

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

int *ptr = module1->getIntData();

可以,在mainapp端释放/删除这个内存吗?

int *ptr = module1->getIntData();
delete ptr; //(or free(ptr))

如何实现malloc / free实现。 是否可能,该库将使用另一个然后mainapp?

我强烈建议进行分配的模块也负责进行解除分配。 从而:

int *ptr = module1->getIntData();
...
module1->freeIntData(ptr);

这允许不同的模块毫无困难地使用不同的分配器(malloc / free,new / delete,slab allocator等)。

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

如果有一个偶然的机会,您可能需要将这个批次移植到Windows,那么您真的希望模块释放它们分配的内存。 不同的DLL可以具有不同的堆,并且可以产生各种有趣的问题。 (正如@trojanfoe在评论中所说:调试和发布版本之间的差异足以引起悲伤。)

我只建议使用std::unique_ptr如果你可以保证所有模块总是使用相同的编译器标志使用相同版本的相同编译器构建。 (我坚信保持动态库接口尽可能简单和像C一样。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM