首页 > 解决方案 > 内存中的内存是如何取消固定的。跨度?

问题描述

我相信以下两段代码应该是等效的:

// first example
string s = "Hello memmory";
ReadOnlyMemory<char> memory = s.AsMemory();
using (MemoryHandle pin = memory.Pin())
{
    Span<char> span = new Span<char>(pin.Pointer, 1);
    Console.WriteLine(span[0]);
}

// second example
ReadOnlySpan<char> span2 = memory.Span;
Console.WriteLine(span2[0]);

两个代码都将打印“H”。

我不明白的是第二个示例中的内存取消固定在哪里。

据我了解,字符串是在MemoryHandle堆上分配的,固定它并从指针创建跨度。MemoryHandle.Dispose取消固定记忆。

我相信也memory.Span必须固定内存,否则 span 无法访问指针。但是第二个例子中的内存是如何取消固定的呢?

标签: c#memory-managementheap-memory

解决方案


最后一个假设是不正确的:memory.Span不需要固定内存,因为垃圾收集器知道它的底层引用。如果您想将指针传递给本机 API,则固定是独立可用的。


推荐阅读