我必须将我的应用程序分成几个逻辑模块.mainapp: module1.so module2.so module3.so等每个模块是一个* .so库,它将在运行时加载.每个模块共享相同的接口,并将返回一些数据数组.例如:int * ptr = module1-...

我必须将我的应用程序分成几个逻辑模块.
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分配器等).
在Posix系统上,一个进程中只能有一个malloc(和free)实现,因此,如果getIntData的定义是“返回必须由free释放的指针”,那么您就可以了.另一方面,我认为有可能编写两个C编译器,它们可以用来编写module1和module2,但不能删除对方的new分配的内存. (尽管我认为目前不存在此类编译器).
如果您可能有一点微不足道的机会,那么您可能必须将此批次移植到Windows,那么您真的希望模块取消分配它们分配的内存.不同的DLL可能具有不同的堆,并且随之而来的是各种有趣的问题. (正如@trojanfoe在评论中所说:调试和发布版本之间的差异足以引起悲伤.)
我只建议使用std :: unique_ptr,如果您可以保证将始终使用相同的编译器标记使用相同版本的同一编译器来构建所有模块. (我坚信动态库接口应尽可能简单且类似于C.)
本文标题为:Linux C/C++在动态库中分配/取消分配内存


- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言qsort()函数的使用方法详解 2023-04-26
- ubuntu下C/C++获取剩余内存 2023-09-18
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- C语言详解float类型在内存中的存储方式 2023-03-27
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- Qt计时器使用方法详解 2023-05-30
- Easyx实现扫雷游戏 2023-02-06