C++析构函数中删除指针的适用场景及相关疑问
关于C++析构函数中指针删除的疑问解答
一、哪些指针需要在析构函数中处理?
只有你的类负责管理其生命周期的动态分配资源指针才需要在析构中释放:
- 用
new(单对象)或new[](数组)在自由存储区分配内存的指针:这类内存不会自动回收,必须用delete/delete[]手动释放,否则会造成内存泄漏。 - 指向其他需要手动释放的资源的指针:比如某些C风格API分配的资源(用
malloc/calloc分配的内存需用free释放;文件句柄、网络连接句柄这类通常有专门的关闭/释放函数,不是直接delete)。
二、绝对不能删除所有指针!
以下几种指针绝对不能delete,否则会触发未定义行为(程序崩溃、内存损坏等):
- 指向栈内存的指针:比如指向局部变量、函数参数的指针,栈内存由系统自动管理,
delete会破坏栈结构。 - 指向全局/静态变量的指针:这类变量生命周期贯穿整个程序,
delete会破坏全局内存空间。 - 野指针:未初始化、已经被
delete过,或指向已销毁对象的指针,重复delete会导致严重错误。 - 指向常量/只读内存的指针:比如指向字符串字面量的指针(
const char* str = "hello"),delete这类指针会引发未定义行为。
三、你的示例代码问题分析
你的代码存在几个关键问题:
class ExampleClass { public: ExampleClass(); // pNum未初始化,会成为野指针 ~ExampleClass() { delete pNum; }; int exampleMethod() { pNum = new int(5); // 多次调用时,旧内存会被覆盖,造成泄漏 return *pNum; } private: int* pNum; };
- 指针未初始化:
pNum默认是未定义的野指针,如果对象创建后未调用exampleMethod就销毁,析构函数delete野指针会触发未定义行为,应在构造函数中初始化为nullptr。 - 重复分配内存未释放:多次调用
exampleMethod时,每次都会分配新内存,但旧指针被覆盖,之前的内存无法再访问,造成内存泄漏。 - 概念理解错误:
delete pNum的作用是释放pNum指向的自由存储区内存(即存储值5的空间),pNum作为类成员变量,会随对象销毁自动消失,并非“指针被删除而值留在free store”。
四、更安全的替代方案
现代C++中,建议使用智能指针(std::unique_ptr、std::shared_ptr)替代原始指针,它们会自动在生命周期结束时释放资源,无需手动在析构函数中delete,从根源避免内存泄漏和野指针问题:
#include <memory> class ExampleClass { public: ExampleClass() : pNum(nullptr) {}; ~ExampleClass() = default; // 智能指针自动处理资源释放 int exampleMethod() { pNum = std::make_unique<int>(5); return *pNum; } private: std::unique_ptr<int> pNum; };
内容的提问来源于stack exchange,提问作者Issac Howard
相关产品推荐
相关产品推荐

