使用动态库(dll/dylib)进行内存管理

Memory management with dynamic libraries(dll/dylib)

本文关键字:内存 管理 dylib 动态 dll      更新时间:2023-10-16

应用程序中分配内存并在从dll/dylib调用的函数中释放内存是否有任何问题?

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

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

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

为了避免任何问题,动态库通常会公开自己的分配和自由例程以保证一致性。

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

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

虽然很危险,而且容易出错。一般来说,最好在同一个地方处理内存分配和释放,并将指针传递给需要访问分配对象的任何其他内容。

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