You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中nullptr与delete的机制、差异及使用场景咨询

C++中nullptr与delete的机制、差异及使用场景

一、代码片段1与2的内存差异

代码*1的行为

type* var=new type;
var=nullptr;
  • 第一行new type在堆内存上分配一块能容纳type对象的空间,调用type的构造函数初始化对象后,把这块内存的地址赋值给指针var。
  • 第二行var=nullptr只是把指针var本身的值改成空指针,意味着它不再指向任何有效内存,但堆上的type对象内存完全没被释放。如果没有其他指针指向这块内存,它会一直占用空间直到程序结束,这就是典型的内存泄漏。

代码*2的行为

type* var=new type;
delete var;
  • 第一行和*1逻辑一致,在堆上分配内存并初始化对象,指针var指向该内存。
  • 第二行delete var会执行两个关键操作:先调用type对象的析构函数(清理对象内部资源,比如对象里的动态内存),再把var指向的堆内存归还给操作系统,这块内存后续可被重新分配使用。
  • 注意:delete后,var本身的地址值不会改变,但这个地址已经变成野指针(指向的内存不再属于当前程序),所以通常delete后会把指针设为nullptr,避免后续误操作。

二、nullptr和delete的各自使用场景

nullptr的使用场景

  • 初始化空指针:声明指针时如果还没确定指向对象,用nullptr初始化,避免出现野指针(例:type* ptr = nullptr;)。
  • 重置指针:当指针不需要再指向有效内存时(比如释放内存后、对象已销毁),把指针设为nullptr,后续可以通过if (ptr == nullptr)判断指针是否有效。
  • 区分重载函数:nullptr是强类型的空指针常量,相比旧的NULL(本质是0),能更精准匹配指针类型的重载函数。

delete的使用场景

  • 释放堆内存:用new(new[]对应delete[])在堆上分配的内存不再需要时,必须用delete释放,否则会造成内存泄漏。
  • 裸指针管理堆对象:如果用裸指针管理堆对象,delete是唯一能主动释放对应堆内存的方式(智能指针会自动调用delete,无需手动编写)。

三、二者能否混用?

可以配合使用,但不能互相替代:

  • 正确用法:用delete释放堆内存后,把指针设为nullptr,示例:
type* var=new type;
delete var;
var=nullptr;

这么做的好处是,后续如果误操作再次调用delete var,由于C++标准规定delete nullptr是安全的(不会产生任何副作用),不会导致程序崩溃。

  • 绝对不能只设nullptr不调用delete(像代码*1那样),这会直接造成内存泄漏;delete nullptr本身是安全的,但不能用nullptr替代delete的内存释放功能。

内容的提问来源于stack exchange,提问作者NormalToad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:35:00