我必须将我的应用程序拆分为几个逻辑模块。
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?
答案 0 :(得分:4)
我强烈建议进行分配的模块也负责进行解除分配。因此:
int *ptr = module1->getIntData();
...
module1->freeIntData(ptr);
这允许不同的模块毫无困难地使用不同的分配器(malloc / free,new / delete,slab allocator等)。
在Posix系统上,进程中只能有malloc
(和free
)的一个实现,所以如果getIntData
的定义是“返回一个必须是空闲的指针” d by free
“那么你就没事了。另一方面,我认为可以编写两个可用于编写module1和module2的C ++编译器,但不能 delete
由另一个{{em> new
内存分配的内存{{} 1}}。 (虽然我不认为目前存在这样的编译器。)
如果有一个偶然的机会,你可能不得不将这个批次移植到Windows,那么你真的希望模块释放他们分配的内存。不同的DLL可以具有不同的堆,并且可以产生各种有趣的问题。 (正如@trojanfoe在评论中所说:调试和发布版本之间的差异足以引起悲伤。)
如果您可以保证所有模块始终使用相同的编译器标志使用相同版本的相同编译器构建,我只建议使用std::unique_ptr
。 (我坚信保持动态库接口尽可能简单和类似C语言。)