我正在使用动态加载 DLL 的 exe。 DLL 中的函数在堆上分配内存并将指向该内存的指针传递给 exe。
一位学长说这样做是不好的做法。他说,如果我必须在 exe 和 DLL 之间共享内存,则 exe 必须分配内存并将指向该内存的指针传递给 DLL,反之亦然。这是真的?为什么?
编辑:就我而言,我计划在 DLL 本身内部分配和释放内存。
最佳答案
以下是让调用者提供指针的一些原因:
- 对称所有权语义。其他几个答案已经解释了这一点。
- 避免分配器和释放器不匹配。如 Aesthete's answer 中所述,如果 DLL 分配一个指针并返回它,调用者必须调用相应的释放器来释放它。这不一定是微不足道的:DLL 可能静态链接到一个版本,例如
malloc
/free
而.exe
链接到malloc
/free
的不同版本。 (例如,DLL 可能使用发布版本,而.exe
使用专门的调试版本。) - 灵 active 。如果 DLL 用于一般用途,则让调用者分配内存可为调用者提供更多选择。假设调用者不想使用
malloc
而是希望从某个特定的内存池中分配内存。也许这是调用者可以提供指向堆栈上分配的内存的指针的情况。如果 DLL 自己分配内存,则调用者没有这些选项。
(第二点和第三点也可以通过 .exe
提供一个分配器/释放器供 DLL 代码使用。)
关于c++ - 在 DLL 中分配内存并将指向它的指针指向客户端应用程序是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13625388/