C++ delete指针依然可访问问题
写在前面
c++之中,指针delete之后,竟然还可以访问? 这里参考了SO上c++ delete pointer issue, can still access data和C++ delete - It deletes my objects but I can still access the data?两个主题问答。
问题代码:
#include <iostream>
class XTest{
public:
XTest() {};
virtual ~XTest() {};
int a;
int b;
};
class YTest
{
public:
YTest() {};
virtual ~YTest() {};
int c;
XTest * testFunc()
{
c = 9;
XTest * z = new XTest;
z->a = 1;
z->b = 5;
return z;
};
};
int main()
{
XTest *z;
YTest *t = new YTest();
z = t->testFunc();
std::cout << "z->a " << z->a << std::endl;
std::cout << "t->c " << t->c << std::endl;
delete z;
delete t;
//即使z已经被删除,为什么此处可以设置a值?
z->a = 10;
// 为什么此处z->a打印出10?
std::cout << "z->a " << z->a << std::endl;
// 为什么t->c 存在并打印出值?
std::cout << "t->c " << t->c << std::endl;
//------------------------------------------------------
int * p = new int;
*p = 4;
// 如所料,打印4
std::cout << "*p= " <<*p << std::endl;
delete p;
// 打印多少呢?
std::cout << "*p= " << *p << std::endl;
return 0;
}
测试此程序3次输出为:
第一次结果:
z->a 1
t->c 9
z->a 10 竟然是正确的
t->c 12937152 随机值
*p= 4
*p= 12936808 随机值
第二次结果:
z->a 1
t->c 9
z->a 10
t->c 15099840 随机值
*p= 4
*p= 15099496 随机值
第三次结果:
z->a 1
t->c 9
z->a 10
t->c 16213952 随机值
*p= 4
*p= 16213608 随机值
问题总结:
1)c++中delete指针后,这块内存仅被标记为可以使用,在没有被分配之前里面的内容还是完好的。而且delete不负责将指针设置为NULL。
2)使用已经delete的指针的行为是未定义的,这种指针成为悬挂指针(dangling pointer),不要依赖于这类行为。
3)是否在delete之后立马设置指针为NULL呢,关于这个问题,SO上看法不太统一。