目前,我有这个代码:
class SO
{
public SO()
{
var ptrManager = new PointerManager();
int i = 1;
ptrManager.SavePointer(ref i);
Console.WriteLine(i); // prints 1
i = 2; //change value to 2 within the current scope
Console.WriteLine(i); // prints 2
ptrManager.SetValue(3); // change value to 3 in another (unsafe) scope
Console.WriteLine(i); // prints 3
}
}
unsafe class PointerManager
{
private int* ptr;
public void SavePointer(ref int i)
{
fixed (int* p = &i)
{
ptr = p;
}
}
public void SetValue(int i)
{
*ptr = i;
}
}
首先,我告诉PointerManager
创建一个指向我的 int 的指针i
。这样,稍后,我将能够告诉PointerManager
更改 的值i
,而无需i
再次传入。
到目前为止,这似乎运作良好。但是,我读过如果 GC 决定i
在内存中移动,那么我的指针ptr
将变得无效,并且后续调用SetValue
将产生不可预测的行为。
那么,如何防止 GC 移动i
呢?或者,是否有更好的方法来实现我的目标?
我还被告知只需添加即可GCHandle.Alloc(i, GCHandleType.Pinned);
,但这似乎不对...
编辑:更具体地说,GCHandle.Alloc
将在方法的开头调用SavePointer
。