由于加载了堆或dll的损坏,Windows触发了断点

时间:2012-05-03 12:59:19

标签: c# c++

我有一个 C ++ 文件,其中包含一些我在C#中调用的导出函数。其中一个功能是:

char segexpc[MAX_SEG_LEN];

extern "C" QUERYSEGMENTATION_API char* fnsegc2Exported()
{
    return segexpc2;
}

在程序的某个地方,我也在做这件事:

if(cr1==1)
{
strcpy(segexpc, seg);
}

在我的 C#计划中,我按照以下方式调用上述内容:

[DllImport("QuerySegmentation.dll", EntryPoint = "fnsegcExported", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern StringBuilder fnsegcExported();

this.stringbuildervar = fnsegcExported();

以前,我没有收到任何错误,但是当我在visual studio中进行调试时,我突然发现了这个错误。

Windows has triggered a breakpoint in SampleAppGUI.exe.
This may be due to a corruption of the heap, which indicates a bug in SampleAppGUI.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while SampleAppGUI.exe has focus.

此错误仅出现在必须显示窗口之前的末尾。我没有按任何F12键,也没有设置任何断点,但我不确定为什么错误在此时发生和破坏。 this.stringbuildervar = fnsegcExported();
当我按下继续时,窗口将显示正确的输出。

2 个答案:

答案 0 :(得分:1)

如果您从

更改了外部声明,会发生什么
[DllImport("QuerySegmentation.dll", EntryPoint = "fnsegcExported", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern StringBuilder fnsegcExported();

[DllImport("QuerySegmentation.dll", EntryPoint = "fnsegcExported", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern string fnsegcExported();

然后通过以下方式调用它:

this.stringbuildervar = new StringBuilder(fnsegcExported());

string似乎更合适。或者更好的是使用Marshal类来编组非托管char *返回托管字符串。

[DllImport("QuerySegmentation.dll", EntryPoint = "fnsegcExported", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr fnsegcExported();

string managedStr = Marshal.PtrToStringAnsi(fnsegcExported);
this.stringbuildervar = new StringBuilder(managedStr);

答案 1 :(得分:0)

您在此行中看到错误的原因是它是您拥有调试信息的最后一个堆栈帧。

幸运的是,在您的情况下,C ++方面的代码非常少。确保segexpc包含零终止字符串。

我怀疑因为字符串生成器的默认容量是16,所以您可能无法以这种方式返回更长的字符串。也许你想只返回字符串。

我也想知道你的C ++字符串是否必须是非Unicode的。这会在每次转换时损害性能。