static void Main()
{
Do();
Console.ReadKey();
}
unsafe public static void Do()
{
for (int x = 0; x < 10000; x++)//分配一系列立即变成垃圾的对象
{
new object();//不可到达的,被标记为垃圾
}
IntPtr org;
byte[] bytes = new byte[1000];//在垃圾对象后分配这个数组。
fixed (byte* pytes = bytes)
{
org = (IntPtr)pytes;
}
GC.Collect();//强迫进行一次垃圾回收,垃圾对象会被回收,数组可能会被压缩
fixed (byte* pytes = bytes)
{
Console.WriteLine(org == (IntPtr)pytes);//true或false,如果数组被压缩,指针也就改变了。
}
}
fixed 语句禁止垃圾回收器重定位可移动的变量。fixed 语句只能出现在不安全的上下文中。Fixed 还可用于创建固定大小的缓冲区。fixed 语句设置指向托管变量的指针并在 statement 执行期间“钉住”该变量。如果没有 fixed 语句,则指向可移动托管变量的指针的作用很小,因为垃圾回收可能不可预知地重定位变量。C# 编译器只允许在 fixed 语句中分配指向托管变量的指针.