C++ 智能指针:示例、原理与适用场景详解
智能指针的设计初衷是为了解决原生指针带来的内存管理问题。要理解它的作用,得先看看原生指针有哪些'痛点'。
原生指针的'痛'
原生指针是 C++ 里的'双刃剑',底层灵活但也容易出错。在引入智能指针之前,裸指针常引发以下典型问题:
- 内存泄漏:C++ 没有垃圾回收机制,全靠程序员手动
delete。一旦忘记或逻辑跳转跳过释放操作,堆内存就会泄露。 - 野指针:包括悬空指针、未初始化指针、指向已销毁栈内存的指针等。它们指向无效地址,访问会导致未定义行为。
- 双重释放:对同一指针重复调用
delete,属于未定义行为,大概率导致崩溃。 - 指向超出作用域的栈内存:函数返回局部变量的地址,函数结束后栈帧弹出,指针即失效。
- 容器里存裸指针但未清理:
std::vector<int*>存储裸指针时,容器析构不会自动删除内部元素,需手动遍历清理。 - 指针重定向导致原对象丢失:指针重新赋值后,原对象失去引用且无法找回。
- 异常导致释放被跳过:抛出异常时若未捕获并释放资源,会造成泄漏。
代码示例
#include <iostream>
using namespace std;
// 指向超出作用域的栈内存
int* getNum() {
int a = 10; // a 在栈上,函数结束后销毁
return &a; // 返回 a 的地址
}
int main() {
int* p = getNum();
cout << *p << endl; // 访问野指针,结果不可控
return 0;
}
// 双重释放
int* p = new int(10);
delete p;
delete p; // 未定义行为


