c++ - 将变量设置为等于 nullptr 的变量

标签 c++ pointers linked-list

我有一个名为 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 的新变量。虽然地址相同,但 xmy_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/

相关文章:

c++ - 词法分析

c++ - 如何更新停靠角?

c - 为什么类型转换从 int 打印为 float "0.0000"

c++ - 对齐是否与指向模板对象的指针有关? (C++)

Python 链表追加

c++ - 非限定名称查找找到内联命名空间成员

python - 使用 GDB-Python Types API 查找嵌套结构的绝对偏移量

c - 为什么我的函数中的函数被视为指针?

c++ - 将链表存储为数组 C++ 中的索引

c - 读取一个字符串,当找到换行符时将每个字符串存储到数组中