【问题标题】:heap corruption detected before block during dll export在 dll 导出期间块之前检测到堆损坏
【发布时间】: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);
 }

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

【问题讨论】:

    标签: c# c++


    【解决方案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[])。

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

    【讨论】:

      猜你喜欢
      • 2013-10-12
      • 2023-03-21
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      相关资源
      最近更新 更多