我创建了一个常规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;
在发布模式下没有问题,但在调试模式下,应用程序显示断言失败。有人可以解释这种行为背后的原因。
答案 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
,这是为此目的编写的。