c++ - 为外部 dll 上的缓冲区分配内存并在主应用程序上使用它是否安全?

标签 c++ c dll malloc

正如主题.. 我在一个应用程序中发现了类似的东西。在主 C 应用程序中,我们有声明:

void* buff = NULL;

然后有一个电话:

ReadData(&buff);
SaveToFile(buff);

SaveToFile() 是来自 main 函数的 C 函数。

ReadData(void* * ) 是来自外部 dll 的 C++ 函数。在此函数中,缓冲区的内存由 malloc 函数分配并存储数据。

所以这是我的问题:它正确吗?

最佳答案

一个正在运行的进程中的所有模块共享相同的地址空间(不管你是 Windows 还是 Linux 或任何实际上,这是一个共同的原则)。但是,请注意:从模块 A 读取或写入模块 B 拥有的缓冲区没有问题 - 但释放缓冲区可能很糟糕。

在 Windows 上,它取决于应用程序所链接的运行时库。如果不是 DLL 运行时('多线程 dll'),每个模块都会维护自己的堆管理器拷贝。因此,分配内存区域的模块也必须负责销毁它,因为只有它自己的堆管理器知道它。如果您遵循这条准则,就不会遇到问题(链接到 DLL 运行时可以避免问题,因为所有模块都处理驻留在 msvXXXnnn.dll 中某处的同一个堆管理器,但会引起其他问题)。

编辑:

ReadData(void* * ) is a C++ function from external dll. In this function memory for buffer is allocated by malloc function and filed with data.

这可能会遇到上述分配器问题。要么向该 DLL (FreeData) 添加另一个函数,该函数明确负责释放缓冲区(如 Neil Butterworth 所提议的那样),然后只调用它自己的 free()。或者您添加一个 DLL 函数来查询缓冲区的大小,预先分配它并将其传递给 ReadData(这是最干净的选择 imo)。

关于c++ - 为外部 dll 上的缓冲区分配内存并在主应用程序上使用它是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2154939/

相关文章:

c++ - 稍后在 C++ 中调用基类构造函数(不在初始化列表中)

c++ - 如何使用 ASCII 转换使用字符堆栈评估后缀表达式

c - 将 "a"、 "an"、 "the"替换为文本文件中的空格

java - 使用 JNI 加载 C 插件系统 : undefined symbol

c++ - 在内存使用或编译时间方面哪个更好?

指向 OpenCV GpuMat 的 C++ 指针

c - 关于如何在 C 结构中表示缓冲区

c - 防止将行打印到命令行管道到文件

c++ - VC9 和 VC8 库兼容性

c# - 为什么在调用 C# DLL 时不需要提供字符串缓冲区?