我必须将我的应用程序分成几个逻辑模块。
mainapp
:
module1.so
module2.so
module3.so
- 等等
其中每个模块是一个*.so
库,将在运行时加载。
每个模块共享相同的接口,并将返回一些数据数组。例如:
int *ptr = module1->getIntData();
可以释放/删除此内存吗mainapp
side?
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
(and free
)在一个过程中,所以如果定义getIntData
是“返回一个必须由free
” 那么你就可以了。另一方面,我认为可以编写两个 C++ 编译器,它们可用于编写模块 1 和模块 2,但其中couldn't delete
别人分配的内存new
。 (虽然我不think目前存在这样的编译器)。
如果您有一丝可能需要将这批文件移植到 Windows,那么您really希望模块释放它们分配的内存。不同的 DLL 可以有不同的堆,并且可能会出现各种有趣的问题。 (正如 @trojanfoe 在评论中所说:仅仅调试和发布版本之间的差异就足以引起悲伤。)
我只推荐使用std::unique_ptr
如果您可以保证所有模块始终使用相同编译器标志使用相同编译器的相同版本构建。 (我坚信动态库接口应尽可能简单且类似于 C。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)