Linux C/C++ allocate/deallocate 动态库内存
Linux C/C++ allocate/deallocate memory in dynamic library
我必须将我的应用程序拆分成几个逻辑模块。
mainapp
:
module1.so
module2.so
module3.so
- 等等
其中每个模块都是一个 *.so
库,将在运行时加载。
每个模块共享相同的接口并将return一些数据数组。例如:
int *ptr = module1->getIntData();
free/delete这段内存在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
的定义是"returns a pointer which must be free'd by free
" 那么你会没事的。另一方面,我认为可以编写两个 C++ 编译器,它们可用于编写 module1 和 module2,但不能 delete
分配的内存其他人的new
。 (虽然我 认为 目前不存在这样的编译器)。
如果有一丝一毫的机会,您可能不得不将此批次移植到 Windows,那么您真的希望模块释放它们所占用的内存分配。不同的 DLL 可以有不同的堆,随之而来的是各种有趣的问题。 (正如@trojanfoe 在评论中所说:仅调试版本和发布版本之间的差异就足以引起悲伤。)
我只建议使用 std::unique_ptr
如果您可以保证所有模块始终使用相同编译器的相同版本使用相同的编译器标志构建。 (我坚信要使动态库接口尽可能简单和类似于 C。)
我必须将我的应用程序拆分成几个逻辑模块。
mainapp
:
module1.so
module2.so
module3.so
- 等等
其中每个模块都是一个 *.so
库,将在运行时加载。
每个模块共享相同的接口并将return一些数据数组。例如:
int *ptr = module1->getIntData();
free/delete这段内存在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
的定义是"returns a pointer which must be free'd by free
" 那么你会没事的。另一方面,我认为可以编写两个 C++ 编译器,它们可用于编写 module1 和 module2,但不能 delete
分配的内存其他人的new
。 (虽然我 认为 目前不存在这样的编译器)。
如果有一丝一毫的机会,您可能不得不将此批次移植到 Windows,那么您真的希望模块释放它们所占用的内存分配。不同的 DLL 可以有不同的堆,随之而来的是各种有趣的问题。 (正如@trojanfoe 在评论中所说:仅调试版本和发布版本之间的差异就足以引起悲伤。)
我只建议使用 std::unique_ptr
如果您可以保证所有模块始终使用相同编译器的相同版本使用相同的编译器标志构建。 (我坚信要使动态库接口尽可能简单和类似于 C。)