Linux C/C++在动态库中分配/取消分配内存
作者:互联网
我必须将我的应用程序分成几个逻辑模块.
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.)
标签:allocation,dynamic-library,c-3,linux,c-4 来源: https://codeday.me/bug/20191027/1942379.html