两个指针未正确删除

时间:2017-07-25 13:58:30

标签: c++ pointers

所以基本上我正在尝试这个代码,在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;
}

5 个答案:

答案 0 :(得分:5)

不,将x设置为nullptr也不会将y设置为nullptr

yint*的{​​{1}}而不是参考

因此,int*必然是 1 y == nullptr

1 对于酒吧测验:false 不能x,因为如果分配失败,那么nullptr就会被抛出。如果您撰写std::bad_alloc

y nullptr就可以

答案 1 :(得分:2)

指针未被“删除”。删除操作释放指针指向的内存块,并保持此指针不变。它未设置为nullptr,并且未指向“无”(顺便说一下,您正在清除它)。

指针的行为类似于普通变量,保存一个值(地址)。更改变量的值不会影响另一个变量(除非是别名,但这是另一个故事。)

答案 2 :(得分:0)

指针仍然是正常变量,具有右值和左值。

它们的特殊之处在于它们的正确值是可由用户管理的内存位置的地址。

在您的情况下,xy都分配在堆栈的某个位置。在您y=x的位置,您将y的值设置为x的相同值,但稍后,当您执行x=nullptr时,您只需更改{{1}的值},而不是x的值。

此外,请注意以下事实:ydelete xx引用有效地址,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)

这里发生了什么:

  1. 您将int类型的新指针声明为x。
  2. 您将x指向新的int。
  3. 您将新指针声明为y。
  4. 您将x的值赋给y的值,即y现在也指向新的int。
  5. 删除x。
  6. 打印条件操作的结果,检查y是否等于nullptr,这是假的,因为y仍然指向int并且有一些值。因此,结果打印出0,即为假。
  7. 你返回0! :P