C++中的悬垂指针(delete指针后依然可以访问的问题)
Posted 好儿郎-志在四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中的悬垂指针(delete指针后依然可以访问的问题)相关的知识,希望对你有一定的参考价值。
垂悬指针:
在指针被delete之后,此时指针被称为空悬指针或者垂悬指针,即指向一块曾经保存she数据对象,但现在已经无效的内存的指针。
在C++编程中,当我们delete一个指针后,指针所指向的堆地址空间便被释放,指针值变成无效。虽然指针已经无效,但在很多机器上指针任然保存着已经被释放了的动态内存地址(并且内存地址中的值也并未被擦除),这会让编程人员误解,甚至理解错误。
观察如下实例:
#include <iostream>
#include <stdio.h>
#include <memory>
#include <QDebug>
using namespace std;
class Base
public:
Base()
qDebug() << "Base";
virtual ~Base()
qDebug() <<"~Base";
void print()
qDebug() << "Base Print" << this;
;
int main(int argc, char *argv[])
Base *t = new Base;
std::unique_ptr<Base> up; //用智能指针管理指针t,在智能指针离开括号时,其生命周期便结束,同时释放指针t.
up.reset(t);
up->print();
//up.release();
t->print(); //此时指针t所指向的内存地址已经被释放,但仍然可以调用成员函数,打印指针对象地址。
//delete t;
//t = nullptr;
return 0;
下图是在Qt Creator中使用MSVC套件测试的运行结果:
有木有很惊喜,有木有很意外。
总结:
delete一个指针时,指针指向的内存区域并不会被清空,因为这样会占用CPU周期,此时它是一个危险的指针,会造成一些未定义的现象。像这样的代码有可能会工作很多年,只会在某个时候崩溃,因为程序中的其他地方发生了一些小的改变导致。这也很好地解释了为什么我们Delete一个指针后要将其置为NULL,是为了保证我们使用的是一个有效的指针,而不是会造成不可预知错误的野指针。
同类博文:https://blog.csdn.net/bajianxiaofendui/article/details/86742824#commentBox
C++学习交流群:
以上是关于C++中的悬垂指针(delete指针后依然可以访问的问题)的主要内容,如果未能解决你的问题,请参考以下文章