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 ,访问到该地址说明程序触发存取违例。)
分类:
C++ / C++基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了