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
相关产品推荐
相关产品推荐

