C# Free C使用MarashalAs属性自动封送数据

C# Free C使用MarashalAs属性自动封送数据,c#,c++,c,marshalling,free,C#,C++,C,Marshalling,Free,CLR可以使用封送作为属性将托管类型封送到非托管c/c++类型 我需要的是,释放此分配内存的正确方法是什么。。例如: 在C/C++代码中 char* dummy(char* text){ //do some thing return text;//dummy way to return it to the caller to free it. } 在C中 [DllImport("test.dll",CallingConvention=CallingConvention.Cdecl)] stat

CLR可以使用封送作为属性将托管类型封送到非托管c/c++类型 我需要的是,释放此分配内存的正确方法是什么。。例如:

在C/C++代码中

char* dummy(char* text){
//do some thing
return text;//dummy way to return it to the caller to free it.
}
在C中

[DllImport("test.dll",CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr dummy([MarshalAs(UnmanagedType.LPStr)] string text);
最后是测试

    C# Test
IntPtr marshaledData=dummy("any text");
//what is the proper way to free this memory location

你知道释放内存意味着什么吗?如果你在c中做等价的操作,你会导致未定义的行为,你不应该释放静态内存。我可以使用Marshal类分配内存,并设置值,在完成释放后使用适当的方法,但与MarshalAs相比,它太复杂了。在那个被封送的内存位置上使用MSCRV free方法导致应用程序中止,我想问的是什么是释放这个内存位置的正确方法。C代码非常邪恶,它返回一个错误。如果它没有重新分配文本,那么内存在返回后已经释放,因为pinvoke封送员拥有它。看起来很有效,但当你不看的时候,它就不起作用了。此外,它在写入*文本时损坏堆的可能性也很高。如果它确实分配了,那么您就不能释放它,除非它使用了您的C代码可以访问的分配器。