请看这样一段代码:
class Test
{
public:
void speak()
{
delete this;
m_value = 100;
std::cout << "Who speak..." << std::endl;
}
~Test()
{
std::cout << "diss, addr:" << this << std::endl;
}
volatile int m_value;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test* pTest = new Test;
pTest->speak();
std::cout << "addr :" << pTest << std::endl;
delete pTest;
pTest->speak();
return a.exec();
}
请问这段代码如何输出?可能会有人回答崩了呀,然而实验多次,程序依旧坚挺,输出也正确,为啥呢?
我们最主要的问题就在于delete到底做了什么,释放内存导致是怎么释放的,释放了什么东西?
部分操作系统在delete了以后,只是通知操作系统这块内存不用了,没有做任何操作,可能这块内存还归属于进程,也可能归属于操作系统,内存里面的值一个没变,只要这块内存没被其他的地方申请到,我们就可以正常访问;一旦被其他的地方给申请了并初始化了,那么继续访问得到的值就是错误的;更严重的可能引发崩溃,比如置NULL了等等,这就是大学我们在学习的时候,老师们经常说的未知的行为,就体现在这里。