所以基本上我正在尝试这个代码,在cl(visual studio C ++编译器)中编译并且它保持打印0.不应该等于nullptr吗?
#include <iostream>
#include <string>
using namespace std;
int main() {
int* x;
x = new int(5);
int* y;
y = x;
delete x;
x = nullptr;
cout <<(y==nullptr)<< endl;
return 0;
}
答案 0 :(得分:5)
不,将x
设置为nullptr
也不会将y
设置为nullptr
。
y
是int*
的{{1}}而不是参考。
因此,int*
必然是 1 y == nullptr
。
1 对于酒吧测验:false
不能为x
,因为如果分配失败,那么nullptr
就会被抛出。如果您撰写std::bad_alloc
y
nullptr
就可以
答案 1 :(得分:2)
指针未被“删除”。删除操作释放指针指向的内存块,并保持此指针不变。它未设置为nullptr
,并且未指向“无”(顺便说一下,您正在清除它)。
指针的行为类似于普通变量,保存一个值(地址)。更改变量的值不会影响另一个变量(除非是别名,但这是另一个故事。)
答案 2 :(得分:0)
指针仍然是正常变量,具有右值和左值。
它们的特殊之处在于它们的正确值是可由用户管理的内存位置的地址。
在您的情况下,x
和y
都分配在堆栈的某个位置。在您y=x
的位置,您将y
的值设置为x
的相同值,但稍后,当您执行x=nullptr
时,您只需更改{{1}的值},而不是x
的值。
此外,请注意以下事实:y
前delete x
和x
引用有效地址,y
正确设置为{x
之后1}},而nullptr
保留现在无效的内存地址。这是pointer aliasing的情况,它可以提出几个问题,首先是无效的内存访问错误。
答案 3 :(得分:0)
没有
让我们一行一行:
x = new int(5); //allocate an integer, set it to 5 and return a pointer to it (x will not nullptr).
int* y; //allocate local storage to another pointer.
y = x; //copy the (not nullptr) value of x into y.
delete x; //de-allocate the space previously allocated.
//At this point the value of x is unchanged and y is equal to it.
//De-referencing x (*x) however is undefined because it was deallocated.
x = nullptr; //Set x to nullptr. Has no effect on y.
cout <<(y==nullptr)<< endl; //y still equals the (now invalid) value allocated above.
将变量分配给另一个变量是一次性的事情。之后,对一个的更改将不会反映在另一个中(尽管通过'更改'可能会影响另一个)。
答案 4 :(得分:0)
这里发生了什么: