来自Marshal.AllocHGlobal

时间:2017-12-19 23:09:38

标签: c# memory-management marshalling unsafe unsafe-pointers

在Unity中,我有一个比特流系统,需要不断固定数组才能使用。我通过分配一块非托管内存并在系统处于活动状态时保持指向它来优化它。如果有人建议,请注意;这不 是非托管内存,没有互操作,但我想避免使用GCHandle固定块替代GC的额外开销。

无论如何,我用一个包装器分配; AllocRaw ::的Alloc:

public static void* Alloc(int size) => Marshal.AllocHGlobal(size).ToPointer();

我将此结果缓存到以后调用Marshal.FreeHGlobal,并将其转换为系统使用的字节*。

一旦我写入这些指针中的任何一个,Unity段错误就声称在地址0处发生访问冲突。但是,如果我使用调试器手动执行它,那么一切都很好。一旦控制权返回Unity,它就会崩溃。

我之前遇到Unity在非托管内存上运行的问题(它拥有内存但不应该写入内存),尽管是在一个不同的项目中,没有任何手动分配。是否有可能Unity以某种方式引用我分配的内存,并且写入它会导致内存踩踏?

对于这个问题的广泛性表示抱歉,但就此而言,我在调试方面感到茫然。我正在寻找有关发生内存踩踏的可能性的任何建议,以及我可能采取的步骤(来自托管代码,没有可用的数据断点)来调试它。

编辑:我还应该补充说,这只是一个几百kb的测试用例,没有写入的分配和释放不会引起任何问题。

0 个答案:

没有答案