C#和C+之间的编组+;,还有责任的杂耍 如果我有一个本地C++函数,根据函数的结果,删除某个指针(删除[])的责任在调用方和函数之间不同。当然,我会检查返回值并相应地在C++中执行。 问题是,如果函数在C++和C++之间被封送,那么在C中是否将指针设置为空?足够了?< /P> < P>不,C不能完成C++中的删除[]。您必须使用共享内存分配API,或者编写处理清理的C++包装。< /P> < P>不,只需将本地代码中分配的指针设置为 null >代码>将不会释放内存。CLR只能对其知道的内存(也称为托管内存)进行垃圾收集。它不知道本机内存,因此无法收集它。必须显式释放在托管类型中拥有所有权的任何本机内存

C#和C+之间的编组+;,还有责任的杂耍 如果我有一个本地C++函数,根据函数的结果,删除某个指针(删除[])的责任在调用方和函数之间不同。当然,我会检查返回值并相应地在C++中执行。 问题是,如果函数在C++和C++之间被封送,那么在C中是否将指针设置为空?足够了?< /P> < P>不,C不能完成C++中的删除[]。您必须使用共享内存分配API,或者编写处理清理的C++包装。< /P> < P>不,只需将本地代码中分配的指针设置为 null >代码>将不会释放内存。CLR只能对其知道的内存(也称为托管内存)进行垃圾收集。它不知道本机内存,因此无法收集它。必须显式释放在托管类型中拥有所有权的任何本机内存,c#,.net,c++,pointers,memory-management,C#,.net,C++,Pointers,Memory Management,最常见的方法是通过封送类上的Alloc和Free函数来完成 数据在C和C++之间进行封送,而不是函数。你能重新表述你的问题吗?让object=null怎么样?这难道不会让一个值得信赖的垃圾收集员将其内存收集为未使用的内存吗?你是说CLR垃圾收集器?不,它不知道在本地C++代码中分配的内存。如果类型是作为一个ItpTR被封送的,那么你仍然需要一些内存分配函数来调用IntPtr指向的内存。无论是Windows内存分配功能还是在C++库中调用DELIST[]。如果类型没有被编成INTPTR?@ V

最常见的方法是通过
封送
类上的Alloc和Free函数来完成


数据在C和C++之间进行封送,而不是函数。你能重新表述你的问题吗?让object=null怎么样?这难道不会让一个值得信赖的垃圾收集员将其内存收集为未使用的内存吗?你是说CLR垃圾收集器?不,它不知道在本地C++代码中分配的内存。如果类型是作为一个ItpTR被封送的,那么你仍然需要一些内存分配函数来调用IntPtr指向的内存。无论是Windows内存分配功能还是在C++库中调用DELIST[]。如果类型没有被编成INTPTR?@ VulNET:那就是一个bug。如果代码是一个内存地址,并且不是作为
IntPtr
的marashal'd,那么它将无法在64位进程中工作