gpt4 book ai didi

c++ - Linux C/C++ 在动态库中分配/释放内存

转载 作者:太空狗 更新时间:2023-10-29 20:55:12 25 4
gpt4 key购买 nike

我必须将我的应用程序拆分成几个逻辑模块。

主应用:

  • module1.so
  • module2.so
  • module3.so
  • 等等

其中每个模块都是一个*.so库,会在运行时加载。

每个模块共享相同的接口(interface),并将返回一些数据数组。例如:

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,但不能删除由其他人的。 (尽管我认为目前不存在这样的编译器)。

如果有一丝一毫的机会,您可能不得不将这些东西移植到 Windows,那么您真的希望模块释放它们分配的内存。不同的 DLL 可以有不同的堆,随之而来的是各种有趣的问题。 (正如@trojanfoe 在评论中所说:仅调试版本和发布版本之间的差异就足以引起悲伤。)

我只推荐使用 std::unique_ptr 如果你能保证所有模块总是使用相同编译器的相同版本使用相同的编译器标志构建。 (我坚信要使动态库接口(interface)尽可能简单和类似于 C。)

关于c++ - Linux C/C++ 在动态库中分配/释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36420174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com