C# 本机C++;C语言使用的库# 我编写了一些C++代码,需要从C++中调用(我不能用C++代码替换C++原生代码)。 我发现内存损坏,同时使用MalC/Cf/Apple在本地C++代码中分配/释放内存。然后我使用了LocalAlloc/LocalFree和HeapAlloc/HeapFree,也遇到了同样的问题

C# 本机C++;C语言使用的库# 我编写了一些C++代码,需要从C++中调用(我不能用C++代码替换C++原生代码)。 我发现内存损坏,同时使用MalC/Cf/Apple在本地C++代码中分配/释放内存。然后我使用了LocalAlloc/LocalFree和HeapAlloc/HeapFree,也遇到了同样的问题,c#,c++,unmanaged,C#,C++,Unmanaged,分配/解除分配似乎是正确的,它们发生在由本机代码创建的单独线程中 我想知道哪一个是在C+< /p>调用的本地C++库中使用的最佳分配策略。 编辑:发现问题:问题不在分配/解除分配代码中,而是在被释放后写入的一些内存中。 < P> Windows驱动开发工具包建议不要使用C++驱动程序。 另外,最好的策略是让驱动程序管理自己的内存。当c#需要查看数据时,然后传递一个编组的缓冲区并让驱动程序填充它,只要代码的c#端使用编译器的/unsafe开关和用于保存数据缓冲区的fixed关键字,我想你应该没问

分配/解除分配似乎是正确的,它们发生在由本机代码创建的单独线程中

我想知道哪一个是在C+< /p>调用的本地C++库中使用的最佳分配策略。


<强>编辑:发现问题:问题不在分配/解除分配代码中,而是在被释放后写入的一些内存中。

< P> Windows驱动开发工具包建议不要使用C++驱动程序。 另外,最好的策略是让驱动程序管理自己的内存。当c#需要查看数据时,然后传递一个编组的缓冲区并让驱动程序填充它,只要代码的c#端使用编译器的
/unsafe
开关和用于保存数据缓冲区的
fixed
关键字,我想你应该没问题

<>关于内存分配问题,它可能不是导致问题的C++内存分配代码,它可能是C++代码与驱动程序交互的方式……可能使用<代码>虚拟ALLUC/<代码> >代码> ValualField对文档……

<强>编辑:当尝试与缓存交互后分配缓冲区来保存C++的数据时,可能是竞争条件或中断延迟造成内存损坏……只是一个想法…… 希望这有帮助, 顺致敬意,


汤姆。

< P>你的问题缺少基本细节,它不清楚C++代码分配的内存是否需要在C端释放。这通常是通过CLR中的P/Invoke marshaller或COM互操作层自动完成的。或者可以通过将方法参数声明为IntPtr,然后使用封送处理类来手动完成

如果是自动完成的,则必须使用COM内存分配器CoTaskMemAlloc()。如果您自行封送,还可以使用GlobalAlloc(),在C#端使用marshal.FreeHGlobal()发布。使用GlobalAlloc()没有任何好处,您最好使用CoTaskMemAlloc()并与Marshal.FreeCoTaskMem()一起发布

但你自己也应该注意到这一点。如果托管代码释放内存,则在C++侧使用MalCube(或HealAlcLoE)进行分配会导致泄漏而不是损坏。Vista和Win7有一个更严格的堆管理器,如果它发现一个错误的版本,就会终止程序


对我来说,你的C++代码中有简单的堆损坏。这是非托管C++编程最常见的灾祸,超过运行缓冲区的末尾,写入已释放的内存,指针值不好。消除此类错误的方法是仔细检查代码并使用调试分配器,如
提供的调试分配器。问题是,关于驱动程序,它是关于一个C++库,它与一个驱动程序接口(这是我编写一个本地C++库而不是编写C代码)的唯一原因。此外,驱动程序是一个用户模式USB驱动程序,其中C++的使用是在DDK示例中。我将编辑这个问题,因为这个问题与驱动程序本身无关。我将研究C++与驱动程序之间的交互,因为我已经没有关于内存分配代码的想法了:问题是内存被从驱动程序中读出来后从驱动程序写入的问题。谢谢你让我想到了分配/解除分配之外的另一个问题routines@Enrico:很高兴听到你发现了问题!:)右图:实际上这是由于释放后写入的内存导致的堆损坏。