在 dll 导出期间块之前检测到堆损坏

Posted

技术标签:

【中文标题】在 dll 导出期间块之前检测到堆损坏【英文标题】:heap corruption detected before block during dll export 【发布时间】:2021-04-06 04:15:33 【问题描述】:

在将 char 数组数据从 C++ 导出到 C# 时,我收到了检测到堆损坏的错误。

C++ 代码

extern "C" __declspec(dllexport) void __cdecl Table(char RetData[5]))

---
//Getting data in list
----
std::list<structureData>::iterator it = list.begin();
RetData = it->data;

C#代码

// dll import code

 public  void DbData()
 
   char[] retValue = new char[5];
   Table(retValue);
 

有人可以帮助它为什么会抛出错误以及我必须做哪些更改

【问题讨论】:

【参考方案1】:

char的定义:在C++中通常为8位字节,在C#中为16位或2字节。因此,C#(可能)分配(至少)10 个字节,而 C++ 可能使用 5 个字节。

但这不会破坏这里的堆。

C++ 代码接受 RetData,它是指向 C# 分配的空间的指针的副本。 然后它将 RetData(指向 C# 分配空间的 C++ 本地指针)更改为指向列表的内部。 现在这一切都被破坏了,我猜堆被编组破坏了(尝试从 C++ 空间转移到 C# 空间,必要时进行转换)。

我建议查看pinvoke.net,了解如何从 C# 调用 Windows“管道”dll 的良好示例。

我有一种感觉,你会想要使用 .Net 的 StringBuilder 类,.Net 的编组使用它做一些聪明的事情来从 C/C++ 字符串中获取数据。否则,您更有可能想要使用 byte[](使用本地转换代码,而不是 char[])。

如果您想在 *** 上进一步了解这一点,则必须显示 dll 导入代码。

【讨论】:

以上是关于在 dll 导出期间块之前检测到堆损坏的主要内容,如果未能解决你的问题,请参考以下文章

检测到堆损坏(动态数组)

字符串的动态数组,但我检测到堆损坏

在 C++ 中检测到堆损坏错误

释放 2D 数组 - 检测到堆损坏

检测到堆损坏 - 仅限 iPhone 5S

将项目从 vc6 升级到 vc9 后检测到堆损坏