C++ 智能指针详解
智能指针是为了解决原生指针问题而设计的。要理解其作用,需先明确原生指针的痛点,这涉及对虚拟内存堆和栈的理解。
1. 原生指针的'痛'
原生指针(裸指针)是 C++ 中的双刃剑,其底层性和灵活性既是优势也是劣势。在智能指针出现前,使用指针常出现以下典型问题:
- 内存泄漏:C++ 无垃圾回收机制,依赖程序员手动管理堆空间回收。忘记
delete或控制逻辑跳过释放操作会导致内存泄漏。 - 野指针:指向未初始化或已失效地址的指针。包括悬空指针、未初始化指针、指向超出作用域栈内存的指针等。
- 双重释放:将已释放的指针再次释放,属于未定义行为,通常导致崩溃。
int* p = new int(10);
delete p;
delete p; // 未定义行为
- 指针指向了超出作用域的栈内存:返回局部变量的地址,函数结束后栈帧弹出,指针失效。
#include <iostream>
using namespace std;
int* getNum() {
int a = 10;
return &a;
}
int main() {
int* p = getNum();
cout << *p << endl; // 访问野指针
return 0;
}
- 指针未初始化:定义后未设初值,值为栈上遗留的垃圾值。
int* p;
cout << *p << endl; // 危险
- 指针悬空:多个指针指向同一对象,其中一个释放后,另一个仍指向已释放对象。
int* p1 = new int(10);
int* p2 = p1;
p1; p1 = ;
std::cout << *p2 << std::endl;


