当删除内存空间时,指针的值保持不变或被更改?对象内容是否会被更改?

时间:2015-04-19 06:00:33

标签: c++

class Node{
    int a;
    Node* next;
    Node():a(20),next(NULL){};
};

int main()
{
    Node* p = new Node;
    p->next = new Node;
    Node* q = p->next;

    **delete q; (or delete p->next;)**

    cout << q               << endl;        // always changed to "0000 8123"
    cout << &q->a           << endl;        // 0000 8123
    cout << &q->next        << endl;        // 0000 8127

    cout << q->a << q->next << endl;        // error!  why it is ok to access their address  and no to access their value? 

    cout << p->next        << endl;         // p->next no change , why ?
    cout << p->next->a     << endl;         // changed to "DDDD DDDD"
    cout << p->next->next  << endl;         // changed to "-5726 2307"

    return 0;
}

我知道指针p和q在堆栈上,对象在堆上。

delete q; q被更改为指向堆栈中的对象;
delete p->next;为什么p->的值接下来没有改变?

删除的具体步骤是什么?

2 个答案:

答案 0 :(得分:1)

当您调用delete qdelete p->next时,指针仍然指向内存中的位置,但它们指向的对象将被删除。这就是为什么如果在q指向的对象中打印出变量a的地址,它会显示该内存的位置,下一个相同。但是,当您实际尝试从该对象获取数据(取消引用指针)时,指针指向垃圾。

正确的方法是

  

delete q; q = nullptr;

答案 1 :(得分:0)

内存中的值未被清除。 delete告诉程序稍后可以使用此块并使用新分配覆盖它。

您的指针仍然指向可以覆盖的内存块,这会在开发过程中进一步导致意外错误。

要防止未定义的行为,请在nullptr对象后将指针指定给delete