我创建了一个结构指针,但每个新节点的调用都返回相同的地址。但我希望每次调用新节点都会返回不同的地址。有人可以帮忙吗?
public unsafe struct Node
{
public int Data;
}
class TestPointer
{
public unsafe Node* getNode(int i)
{
Node n = new Node();
n.Data = i;
Node* ptr = &n;
return ptr;
}
public unsafe static void Main(String[] args)
{
TestPointer test = new TestPointer();
Node* ptr1 = test.getNode(1);
Node* ptr2 = test.getNode(2);
if (ptr1->Data == ptr2->Data)
{
throw new Exception("Why?");
}
}
}
答案 0 :(得分:4)
不要被Node n = new Node();
语法所迷惑! Node
是一个结构,n
在堆栈上分配。您可以在同一环境中从同一个函数中调用getNode
两次,因此您可以自然地获得指向同一堆栈位置的两个指针。一旦getNode
返回,这些指针变得无效('悬空'),因为属于n
的堆栈位置可能被不同的调用覆盖。简而言之:不要这样做。如果您希望CLR分配内存,请将Node
设为一个类。
答案 1 :(得分:0)
n
是否收集了垃圾?