。Net运行时如何“理解”该结构仍具有引用

问题描述 投票:0回答:1

问题是.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流的引用。但是什么是参考文献呢?运行时如何理解不得收集字符串和流?

c# .net garbage-collection
1个回答
1
投票

结构未分配到托管堆上。 AllocHGlobal从非托管内存显式分配。

© www.soinside.com 2019 - 2024. All rights reserved.