当前位置: 首页 > 编程语言 > C#

在C#中分配“非托管”内存Share

时间:2023-04-11 00:46:07 C#

在C#中分配“非托管”内存库。有没有办法在C#中做到这一点?基本上我只需要在C#中做一个malloc...感谢您尝试这样的事情:usingSystem;使用System.Runtime.InteropServices;类示例{staticvoidMain(){IntPtrpointer=Marshal.AllocHGlobal(1024);这使用了Marshal.AllocHGlobal方法:使用指定的字节数从进程的非托管内存中分配内存。您也可以使用字节数组。您可以通过使用不安全例程和固定语句来执行此操作:staticunsafevoidPerformOperation(){byte[]buf=newbyte[1024];fixed(void*ptr=&buf[0]){SomeUnmanagedFunction(newIntPtr(ptr));问题-这是一个重要的问题-SomeUnmanagedFunction在它返回并且代码退出固定块后不允许触摸指针。所以如果你这样做:staticvoidPerformFabulousTrick(){byte[]buf=newbyte[1024];fixed(void*ptr=&buf[0]){SetBuffer(ptr,buf.Length);}填充缓冲区();//将数据放入buf-不-可能会严重崩溃}你只要求麻烦。在这种情况下,您可能希望使用GCHandle,它将托管对象固定在堆上。这也可能很麻烦,因为您需要及时取消它,否则就有损坏堆的风险。一般来说,我建议您确保正确调用P/函数,以便编组器可以为您完成这项工作。我比GlobalAlloc更喜欢固定,因为它定义明确。我无法决定我最不喜欢GlobalAlloc和GCHandle中的哪一个。两者都需要您做更多的工作,因为GC或语言不会为您做这些。这就是我们需要通过使用特定数量的字节来分配和释放非托管内存的方式。以上就是C#学习教程:在c#中分配“非托管”内存共享。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——//演示如何使用Marshal类调用GlobalAlloc和//GlobalFree。IntPtrhglobal=Marshal.AllocHGlobal(100);Marshal.FreeHGlobal(hglobal)本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: