我有一个名为 my_array
的链表数组。
Node* x = my_array[0];
if (head == nullptr)
{
my_array[0] = new Node;
}
为什么这个工作正常,但是
Node* x = my_array[0];
if (head == nullptr)
{
x = new Node;
}
这个怎么会泄漏内存?他们不是指向同一件事吗?它们应该是相同的,对吧?
最佳答案
您误解了指针的工作原理。指针与其他变量一样都是变量,它们的值是内存地址。不多不少。
这一行:
Node* x = my_array[0];
将地址从 my_array[0]
复制到名为 x
的新变量。虽然地址相同,但 x
和 my_array[0]
不是同一件事。它们是两个不同的变量,拥有相同的地址。
这一行:
my_array[0] = new Node;
将my_array[0]
的地址重新分配给堆分配的Node
对象的新地址。它会覆盖 my_array[0]
中的旧地址,从而泄漏内存,因为该地址(以及其中的对象)从未被释放。但是,您仍然将其保留在 x
中,因此您仍然可以释放它并防止泄漏。
这一行:
x = new Node;
本质上做同样的事情,但会覆盖存储在 x
中的地址。不过这可能没问题,因为原始地址仍在 my_array[0]
中(记住 x
只是该地址的拷贝),并且可能稍后会被释放。而且您仍然可以释放 x
中的新地址。所以第二个也可能不会泄漏。
强烈推荐您观看POINTERS由切尔诺。这是非常出色且简单的解释。
关于c++ - 将变量设置为等于 nullptr 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55989677/