问题是.Net运行时如何理解使用Marshal.StructureToPtr
放置到内存中的结构的字段不能由GC释放。
场景下方。
我具有以下结构:
[StructLayout(LayoutKind.Sequential)]
public struct SomeStruct
{
public string s;
public Stream stream;
public SomeStruct(string s)
{
this.s = s;
this.stream = new MemoryStream(0x100);
}
}
有一种实例化结构并将其拖放到内存中的方法:
static IntPtr GetStructRawData()
{
IntPtr ptr = Marshal.AllocHGlobal(1024);
Marshal.StructureToPtr(new SomeStruct("hi"), ptr, false);
return ptr;
}
然后我可以从原始内存中创建新结构:
IntPtr ptr = GetStructRawData();
GC.Collect();
SomeStruct struct2 = (SomeStruct)Marshal.PtrToStructure(ptr, typeof(SomeStruct));
请注意,struct2
确实包含正确的字符串(“ hi”)和正确的流。因此,似乎存在对该字符串和struct1
流的引用。但是什么是参考文献呢?运行时如何理解不得收集字符串和流?
结构未分配到托管堆上。 AllocHGlobal
从非托管内存显式分配。