有人能解释一下为什么每次调用IsAMatch时头和尾都重置为null的原因,即使id传递了新的指针,旧的也被重置了。
我在c ++上有等效的脚本,并且运行良好。
有什么想法吗?
my code
这里的小代码示例显示10,20,因此第二个调用更改了第一个结构
class Program
{
static unsafe void Main(string[] args)
{
MyStruct* myStruct = null;
ChangeMe(ref myStruct, 10);
Console.WriteLine(myStruct->num);
MyStruct* myStruct2 = null;
ChangeMe(ref myStruct2,20);
Console.WriteLine(myStruct->num);
Console.ReadKey();
}
public static unsafe void ChangeMe(ref MyStruct* h, int v)
{
MyStruct myStructNew = new MyStruct(v);
h = &myStructNew;
}
public unsafe struct MyStruct
{
public int num;
public MyStruct(int n)
{
num = n;
}
}
}
答案 0 :(得分:2)
您基本上是在返回指向局部变量的指针,这是完全错误的。
C#php bin/magento indexer:reindex
关键字和C ++ new
关键字之间存在差异,或者与C#中的new
和class
之间的交互有所区别。在C ++中,struct
始终意味着在堆上进行分配,您需要手动对其进行分配。在C#中,对new
的{{1}}调用意味着堆分配,但是对new
的{{1}}调用只是初始化局部变量。
此C#代码:
class
等同于此C ++代码
new
C#struct
关键字创建一个值类型,这意味着在您的情况下,它被分配在堆栈上。然后,从MyStruct myStructNew = new MyStruct(v);
返回之后,堆栈递减,从而释放局部变量。在第二次调用时,堆栈再次增加,为第二次调用分配局部变量。当您调用相同的方法时,第二个MyStruct myStructNew{v};
将使用相同的堆栈位置。