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->的值接下来没有改变?
删除的具体步骤是什么?
答案 0 :(得分:1)
当您调用delete q
或delete p->next
时,指针仍然指向内存中的位置,但它们指向的对象将被删除。这就是为什么如果在q指向的对象中打印出变量a的地址,它会显示该内存的位置,下一个相同。但是,当您实际尝试从该对象获取数据(取消引用指针)时,指针指向垃圾。
正确的方法是
delete q; q = nullptr;
答案 1 :(得分:0)
内存中的值未被清除。 delete
告诉程序稍后可以使用此块并使用新分配覆盖它。
您的指针仍然指向可以覆盖的内存块,这会在开发过程中进一步导致意外错误。
要防止未定义的行为,请在nullptr
对象后将指针指定给delete
。