设置一个等于等于NullPtr的变量的变量
Setting a variable equal to a variable that is equal to nullptr
我有一个链接列表的名为 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
中释放新地址。因此,第二个也可能不会泄漏。
我强烈建议您观看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];
。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 当设置为 const 变量时使用 nullptr
- 检查C++中是否只有一个字符串变量不是 nullptr
- 设置一个等于等于NullPtr的变量的变量
- C++:将指针设置为 nullptr 和将其初始化为新变量类型之间的区别
- C++-引发异常:读取访问冲突.变量为nullptr
- 由nullptr初始化的C++11自动变量
- 将 nullptr 分配给函数指针变量是否安全
- 通过强制转换 nullptr 获取成员变量的偏移量
- nullptr 可以用作变量参数 (varargs) 吗?