1

我创建了一个常规 dll,其中我有一种GetRecordRecordInfo结构分配内存的方法。

struct RecordInfo{
  // Some Data member
}

BOOL GetRecord(RecordInfo *& pRecordInfo)
{
   // Allocate RecordInfo, fill data and return as out paramter.
}

现在我从 MFC 应用程序和完成我的工作后访问这个 dll。我使用删除在客户端发布 RecordInfo。

delete pRecordInfo;

在发布模式下没有问题,但是在调试模式下应用程序显示断言失败。有人可以解释这种行为背后的原因。

4

3 回答 3

2

内存分配和释放应该在组件/dll的同一侧完成。

一个更优雅的解决方案是填充 a std::unique_ptr<RecordInfo>

于 2012-09-20T08:54:29.877 回答
1

如果你想在 DLL 中分配内存并在客户端代码中释放它,你应该确保 DLL 和客户端都是使用相同版本的编译器相同的 CRT “风格”构建的(例如,两者都是调试版本,或者两者都是发布版本)。

这当然是高度约束的。

作为替代方案,为了更好地解耦,您可以从 DLL 函数导出以分配解除分配数据结构(在您的特定情况下,您可以DeleteRecord从 DLL 添加和导出函数,并delete从该函数体内部调用)。

我建议您阅读Old New Thing 博客上的这篇有趣的博客文章,并特别注意开头的句子(强调我的):

分配内存的代码和释放内存的代码需要使用相同的分配器,这应该是您的第二天性。

于 2012-09-20T09:01:15.147 回答
1

生产者和消费者需要就一个共同的分配器达成一致。在 Windows 世界中,最明智的选择是CoTaskMemAlloc/ CoTaskMemFree,它正是为此目的而编写的。

于 2012-09-20T09:02:48.077 回答