在DLL中完成分配时在客户端释放内存?

时间:2012-09-20 08:49:49

标签: c++ mfc

我创建了一个常规dll,我有一个方法GetRecord来为RecordInfo结构分配内存。

struct RecordInfo{
  // Some Data member
}

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

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

delete pRecordInfo;

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

这当然是非常有限的。

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

我建议您在Old New Thing博客上阅读this interesting blog post,特别注意开头的句子(强调我的):

  

分配的代码对你来说应该是第二天性   内存和释放内存的代码需要使用相同的分配器

答案 2 :(得分:1)

生产者和消费者需要就共同的分配者达成一致。在Windows世界中,最安全的选择是CoTaskMemAlloc / CoTaskMemFree,这是为此目的编写的。