设置一个等于等于NullPtr的变量的变量

Setting a variable equal to a variable that is equal to nullptr

本文关键字:变量 NullPtr 一个 设置      更新时间:2023-10-16

我有一个链接列表的名为 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中释放新地址。因此,第二个也可能不会泄漏。

我强烈建议您观看Thecherno的指针。这是极好而简单的解释。

x本身就是一个变量,它不是my_array[0]的别名。更改x仅影响x的值。

示例:

int zero = 0;
int one = 1;
int* arr[] = {&zero};
int* x = arr[0];
x = &one;
std::cout << "*arr[0] = " << *arr[0] << 'n'
  << "*x = " << *x;

输出:

*arr[0] = 0
*x = 1

您可以看到,更改了x点,但数组不受影响。现在,如果您想要别名,则应使用参考:

int* arr[] = {&zero};
int*& x = arr[0];
x = &one; // note the &
std::cout << "*arr[0] = " << *arr[0] << 'n'
  << "*x = " << *x;

输出:

*arr[0] = 1
*x = 1

意味着您应该使用Node *&x = my_array[0];或现代C ,auto& x = my_array[0];