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避免使之成为“空悬指针”。
参考:[delete一个指针之后设置为nullptr ]( https://www.cnblogs.com/imreW/p/17132958.html#:~:text=需要注意的是释放一个指针( delete ptr%3B )实际是删除了 ptr 所指的目标(变量或对象),释放了它所占的堆空间,而不是删除指针 ptr 本身(指针 ,%E4%BC%9A%E5%9C%A8%E5%9C%A8%E5%86%85%E5%AD%98%E9%87%8C%E4%B9%B1%E6%8C%87%E4%B8%80%E9%80%9A%EF%BC%8C%E6%9C%89%E5%8F%AF%E8%83%BD%E6%8C%87%E5%88%B0%E4%B8%80%E4%BA%9B%E9%87%8D%E8%A6%81%E5%9C%B0%E5%9D%80%E9%80%A0%E6%88%90%E5%87%BA%E9%94%99%EF%BC%8C%E5%9B%A0%E6%AD%A4%E4%B8%BA%E4%BA%86%E4%BD%BF%E7%94%A8%E7%9A%84%E5%AE%89%E5%85%A8%EF%BC%8C%E6%88%91%E4%BB%AC%E4%B8%80%E8%88%AC%E5%9C%A8%20delete%20ptr%20%E4%B9%8B%E5%90%8E%E8%BF%98%E4%BC%9A%E5%8A%A0%E4%B8%8A%20ptr%20%3D%20nullptr%3B%20%E8%BF%99%E4%B8%80%E8%AF%AD%E5%8F%A5%E4%BD%BF%E5%85%B6%E4%B8%8D%E6%8C%87%E5%90%91%E4%BB%BB%E4%BD%95%E5%AF%B9%E8%B1%A1%E3%80%82)

浙公网安备 33010602011771号