正如主题.. 我在一个应用程序中发现了类似的东西。在主 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/