delete一个指针之后设置为nullptr

(一)delete一个指针之后设置为nullptr原因

我们在用动态内存分配时,可以使用new在动态内存中为对象分配空间并返回一个指向该对象的指针,比如说int* ptr = new int(1);,在自由空间构造一个int型对象,并返回指向该对象的指针给int* ptr。(注意:ptr只是一个变量,就像是int a=1;中的a一样,不过a是整形变量,而ptr是指针变量)。

为了防止内存耗尽,在动态内存使用完毕后,我们必须将其归还给系统。通过delete将动态内存归还给系统:delete ptr;

需要注意的是释放一个指针(delete ptr;)实际是删除了ptr所指的目标(变量或对象),释放了它所占的堆空间,而不是删除指针ptr本身(指针ptr本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放,指针ptr的真正释放是随着函数调用的结束而消失)。
delete ptr;ptr成了"空悬指针",即指向一块曾经保存数据对象但现在已经无效的内存的指针。此时,ptr会在在内存里乱指一通,有可能指到一些重要地址造成出错,因此为了使用的安全,我们一般在delete ptr之后还会加上ptr = nullptr;这一语句使其不指向任何对象。

(二)未置为nullptr后果

复制代码
#include<iostream>
#include<memory>
using namespace std;

int main() {

    int* ptr = new int(100);
    cout << *ptr << endl;//ptr指向的对象
    cout << ptr << endl;//ptr指向对象地址
    cout << &ptr << endl;//ptr地址
    delete ptr;

    cout << &ptr << endl;//delete后ptr地址不变
    cout << ptr << endl;//delete后ptr指向地址变随机

    return 0;

}
复制代码

运行结果:

(VS2013之后使用safe delete的方式,编译器delete之后的值ptr的值都统一设置为0x00008123 ,访问到该地址说明程序触发存取违例。)

 

posted @   ImreW  阅读(433)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示