c++ - 在 DLL 中分配内存并将指向它的指针指向客户端应用程序是不好的做法吗?

标签 c++ design-patterns

我正在使用动态加载 DLL 的 exe。 DLL 中的函数在堆上分配内存并将指向该内存的指针传递给 exe。

一位学长说这样做是不好的做法。他说,如果我必须在 exe 和 DLL 之间共享内存,则 exe 必须分配内存并将指向该内存的指针传递给 DLL,反之亦然。这是真的?为什么?

编辑:就我而言,我计划在 DLL 本身内部分配和释放内存。

最佳答案

以下是让调用者提供指针的一些原因:

  1. 对称所有权语义。其他几个答案已经解释了这一点。
  2. 避免分配器和释放器不匹配。Aesthete's answer 中所述,如果 DLL 分配一个指针并返回它,调用者必须调用相应的释放器来释放它。这不一定是微不足道的:DLL 可能静态链接到一个版本,例如 malloc/free.exe 链接到malloc/free 的不同版本。 (例如,DLL 可能使用发布版本,而 .exe 使用专门的调试版本。)
  3. 灵 active 。如果 DLL 用于一般用途,则让调用者分配内存可为调用者提供更多选择。假设调用者不想使用 malloc 而是希望从某个特定的内存池中分配内存。也许这是调用者可以提供指向堆栈上分配的内存的指针的情况。如果 DLL 自己分配内存,则调用者没有这些选项。

(第二点和第三点也可以通过 .exe 提供一个分配器/释放器供 DLL 代码使用。)

关于c++ - 在 DLL 中分配内存并将指向它的指针指向客户端应用程序是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13625388/

相关文章:

c++ - 带线程的错误结果处理 vector <int>

c++ - 从文件中加载 const 命名空间变量值

dom - 为什么我们在 DOM 中需要 event.stopPropagation() ?这是不好的架构模式吗?

design-patterns - 复合设计模式育儿组件

c++ - 使用 C++ 库根据键对对象进行排序的最快方法是什么?

c++ - 数据未从 tempArray[] 正确存储到 realArray[][]

c++ - 返回值复制问题(以改进调试时间)——这里的解决方案是什么?

java - 单例设计模式的实现方法

java - Java 避免代码重复的好习惯

c# - 如何在单个事务下执行多个操作