使用C#和C+时的内存分配/释放+;非受管的 我正在使用一些C和C++非托管代码,在处理内存时有两件事我不明白。如果有人能帮我理解: >P>如果变量在C++下动态分配(使用new),然后传递给C++非托管代码。该变量内存是否需要在用户的C++非托管代码下手动释放? >P>如果在C++非托管(使用new)下动态分配变量,然后传递给C,那么垃圾收集器会释放内存吗?p>

使用C#和C+时的内存分配/释放+;非受管的 我正在使用一些C和C++非托管代码,在处理内存时有两件事我不明白。如果有人能帮我理解: >P>如果变量在C++下动态分配(使用new),然后传递给C++非托管代码。该变量内存是否需要在用户的C++非托管代码下手动释放? >P>如果在C++非托管(使用new)下动态分配变量,然后传递给C,那么垃圾收集器会释放内存吗?p>,c#,c++,memory-management,unmanaged,C#,C++,Memory Management,Unmanaged,根据经验,无论哪个组件/对象分配内存,都应该释放内存。对于每一个newa删除,由执行new的一个删除 这就是理想。如果由于C++程序可能会在分配内存的生命周期结束时终止且不存在等原因而不遵循,您的C#应该会清理干净,反之亦然。这真的很简单 取决于 取决于 呃,很抱歉 在典型情况下,C#将跟踪内存,并在不再在C#端使用后随时将其清除。它无法跟踪C++侧的引用,因此互操作中的一个常见错误是,在未托管端完成之前,内存被释放(导致大量的乐趣)。这仅适用于直接引用内存的情况,而不适用于复制内存的情况(典型

根据经验,无论哪个
组件
/
对象
分配内存,都应该释放内存。对于每一个
new
a
删除
,由执行
new
的一个删除

这就是理想。如果由于
C++
程序可能会在分配内存的生命周期结束时终止且不存在等原因而不遵循,您的
C#
应该会清理干净,反之亦然。

这真的很简单

  • 取决于
  • 取决于
  • 呃,很抱歉

  • 在典型情况下,C#将跟踪内存,并在不再在C#端使用后随时将其清除。它无法跟踪C++侧的引用,因此互操作中的一个常见错误是,在未托管端完成之前,内存被释放(导致大量的乐趣)。这仅适用于直接引用内存的情况,而不适用于复制内存的情况(典型情况是在非托管调用期间固定的
    字节[]
    )。当传递给非托管代码的对象/指针的生命周期应该比调用的方法的运行时间长时,不要使用自动编组
  • 在典型的条件下,C语言无法跟踪C++代码中的内存分配,因此不能依赖于自动内存管理。也有例外(例如某些COM场景),但您几乎总是需要手动管理内存。这通常意味着将指针返回到C++代码中进行分配,除非它使用了某种类型的全局分配器(例如,CoMeMyRealItalI化)。请记住,在非托管世界中,没有一个内存管理器可以安全地调用以处置内存;反正你也没有必要的信息 当然,这只适用于指针。传递整数是非常好的,使用自动编组通常意味着编组程序会处理大部分细节(尽管仍然只是在最简单的情况下,所以要小心)。非托管代码是非托管的-您需要完全理解内存是如何分配的,以及如何、何时以及谁负责清理内存

  • 否,因为对象是在托管堆上分配的,所以GC将像往常一样处理释放。问题是,当对象从非托管代码中使用时,您必须告诉他不要取消分配或更改对象的地址,因为GC不知道您将从非托管代码中使用该对象多长时间。这可以通过固定对象来完成。 见问题的答案

  • 不,因为对象是在C++上分配的,非托管堆GC不会接触它。您必须使用delete自己解除分配它

    编辑:
    如果需要在托管代码中分配对象,并在非托管代码中释放,反之亦然,很好地知道,为此目的,可以使用从C中调用的OS堆,在C++中会有类似的调用。

    。看见