【问题标题】:Memory management with dynamic libraries(dll/dylib)动态库(dll/dylib)的内存管理
【发布时间】:2012-08-13 15:40:12
【问题描述】:

在应用程序中分配内存并在从 dll/dylib 调用的函数中释放内存有什么问题吗?

但是要从 dll/dylib 的函数中分配内存并在调用者应用程序中释放它?

【问题讨论】:

  • @KerrekSB - 真的吗?我听说过 DLL 的悲惨故事,其中一个应用程序链接到一个库,该库具有与同一应用程序中使用的其他分配器不同的、根本不兼容的分配器实现。
  • @Flexo:通常的 ODR 约束适用,我想你是对的,当使用动态链接时,这些约束更难满足。但这并不是内存分配所特有的......

标签: c++ memory-management dll dylib


【解决方案1】:

对于静态库,这通常不是问题,但对于动态库通常不是一个好主意。特别是对于项目之间共享的库。

问题是您需要确保调用代码和动态库之间的内存分配函数(new/delete、malloc/free)完全匹配。例如,如果您将 C 运行时与可执行文件静态链接,但动态库是动态链接的(反之亦然),那么您有单独的代码为可执行文件和动态库运行 malloc。

为避免任何问题,动态库通常会公开它们自己的 alloc 和 free 例程以保证一致性。

【讨论】:

  • unique_ptr 也可用于确保 free 始终与分配例程匹配。
【解决方案2】:

不,从某种意义上说它不会有根本问题,但是执行内存分配的应用程序必须返回一个指针,然后该指针可以传递给 DLL,以便它可以执行删除(或释放)。

当然,应用程序和 DLL 必须使用与其他人指出的相同的内存分配,否则会出现混乱。

这很危险并且容易出错。一般来说,如果内存分配和解除分配在同一个地方处理,并且将指针传递给需要访问分配对象的任何其他对象,则效果会更好。

我确实为一个 C# 库工作,该库调用一个 DLL,它分配内存以返回(大)结果,并提供了一个删除方法,然后在应用程序完成它们时调用该方法。效果很好。

【讨论】:

  • 我认为这是对的,但它的措辞太差以至于难以阅读。几乎看起来第三段试图与前两段相矛盾,而实际上它确实在重复。
  • 我只是承认,如果做得好,它确实可以完美运行。但是,我仍然认为这是一件坏事。认知失调……啊。
猜你喜欢
  • 2011-05-01
  • 2011-11-14
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2013-11-21
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多