在 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 导出期间块之前检测到堆损坏的主要内容,如果未能解决你的问题,请参考以下文章