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

2024-04-03

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

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(使用前将#替换为@)

Linux C/C++ 在动态库中分配/释放内存 的相关文章

随机推荐

  • 如何在 OSX 上将卷挂载到 docker?

    我在将主机卷安装到 Docker 映像时遇到问题 我已经在 docker 文件共享设置中添加了一个文件夹 但没有任何效果 我必须做什么才能解决这个问题 例如 我尝试挂载已添加到 Docker Desktop 中的文件共享设置的卷 但出现权限
  • 执行捆绑安装时出现 MySql 错误

    当我进行捆绑安装时 出现以下错误 Installing mysql2 0 3 10 with native extensions Gem Installer ExtensionBuildError ERROR Failed to build
  • 如何解决 Django 中的 UnicodeDecodeError 问题?

    我在 Django 中收到此错误 UnicodeDecodeError at category list utf8 codec can t decode byte 0xf5 in position 7 invalid start byte
  • 在 Google Chrome 中使用 KIOSK 模式进行静默打印(直接)

    我正在开发一个使用 ITextSharp 生成 pdf 的应用程序 并且需要静默或直接打印 我的工作流程是这样的 我在树结构中列出了一些表单 选择表单并单击打印按钮将使用 Itextsharp 自动生成 pdf 并保存到某个位置 这是因为对
  • Keras 用于语义分割,flow_from_directory() 错误

    我试图使用我对 Keras 文档中示例代码的修改 该文档展示了在使用图像掩码代替标签的情况下如何设置 image datagen flow from directory 用于图像分割 我们在其中预测一个类 对于每个像素 顺便说一下 我设置了
  • 如何在 Android 应用程序中使用 yahoo contact api?

    我想从 yahoo contact api 获取所有电子邮件 ID 和姓名here http developer yahoo com social contacts 我已经阅读了 yahoo contact api 的文档 通过我的帐户登录
  • 在 iPhone 应用程序中播放 YouTube 视频而不使用 UIWebView?

    我想通过我的 iPhone 应用程序播放 YouTube 视频 我必须尝试使用 以下代码在我的 iPhone 应用程序中播放 YouTube 视频 self playVideo http www youtube com watch v WL
  • 限制sql窗口函数中的结果集

    假设我想重写以下聚合查询 select id max hittime from status group by id 使用聚合窗口函数 例如 select id max hittime over partition by id order
  • 我什么时候应该和不应该使用这个 C# 实用程序类通过 Interlocked 控制线程

    我试图理解这个类的编写方式背后的逻辑 以及何时应该和不应该使用它 任何见解将不胜感激 internal struct SpinLock private volatile int lockHeld private readonly stati
  • NiFi:ReplaceTextWithMapping 处理器

    我有以下插入语句 insert into temp1 values test1 test2 insert into temp2 values test3 预期成绩 insert into temp1 values 100 200 inser
  • 上传的音频文件无法在 rshiny 中播放

    我开发了一个应用程序 它采用 wav 文件作为输入并播放它 然而它似乎不起作用 另一方面 如果音频文件放置在 www 文件夹中并给出路径名 则可以正常播放 我究竟做错了什么 app R library shinydashboard ui s
  • datagridview vb.net 中特定单元格的单击事件

    我在 datagridview 中有一个单元格 它位于第 8 行第 2 列 该单元格和该单元格仅在单击时我想显示为另存为对话框 但实际上我可以让特定单元格发生单击事件 我该如何执行此操作vb net 在 dataGridView 事件 Da
  • 具有动态适配器的动态列表视图

    我想创建一个动态列表视图 它在滚动到初始列表末尾时添加动态元素 每次滚动位置到达上一个列表的末尾时 都应添加新项目 我怎样才能实现这个目标 谢谢 您需要添加一个滚动侦听器并覆盖onscroll
  • 在 LightningChartJs 中获取一系列的可见点

    存在一个函数LightningChartJs得到所有visible points来自图表中的线或点系列 如果我缩放图表 如果没有可用的可见点 我想显示一些内容 在某些情况下 我的数据会出现中断 现在我必须检查范围并过滤该范围内的所有点 但这
  • Spring 集成超时客户端

    我的 Spring 集成场景是 使用自定义协议发送数据的数十个生产者 大小和内容 我必须解码这个自定义协议 然后处理结果 所以我尝试了很多配置 目前最好的配置如下
  • 如何在不同身份下运行iisexpress应用程序池

    有没有办法以当前登录用户以外的不同身份运行 iisexpress 应用程序池 我目前正在使用 runas 命令解决这个问题 但我想知道 iisexpress 是否有内置的东西可以利用 看起来这应该是可能的 在 IIS Express 站点的
  • 如何在FabricJS中将旋转点位置更改为底部?

    How to change Rotating point position to the bottom see image below 这里是选择对象的配置控制点的链接指南 http fabricjs com fabric intro pa
  • 在 shell 脚本中执行 Vim 命令

    我正在编写一个 Bash 脚本 该脚本运行命令行程序 Gromacs 保存结果 修改输入文件 然后再次循环该过程 我正在尝试使用 Vim 修改输入文本文件 但在打开输入文件后 我无法找到从 sh 文件执行内部 Vim 命令的方法 例如 12
  • get_map 未传递 API 密钥(HTTP 状态为“403 禁止”)

    我一直在面临这个问题get map 功能 ggmap库 在 R 中 我的代码无需指定 API 密钥即可运行 例如source google 持续了几个月 然而 该代码在几周前停止工作 我了解到 Google 已强制要求 API 密钥 或者可
  • Linux C/C++ 在动态库中分配/释放内存

    我必须将我的应用程序分成几个逻辑模块 mainapp module1 so module2 so module3 so 等等 其中每个模块是一个 so库 将在运行时加载 每个模块共享相同的接口 并将返回一些数据数组 例如 int ptr m