准备 C++ 面试时,“智能指针” 几乎是必考点,但很多同学一开口就卡壳:✘ 知道和内存管理有关,但说不清楚到底怎么管✘ 能说出 unique_ptr 和 shared_ptr,却分不清具体区别✘ 听说过循环引用,可面试官追问 “怎么解决” 就懵圈。
别怕!今天咱们用 “说人话” 的方式,把这个高频问题一次性拆解清楚 ~
什么是智能指针?
一句话解释,智能指针就是帮我们自动管理动态分配的内存,而不需要我们再手动释放内存,避免内存泄露。
智能指针有什么作用?
- 自动管理内存:智能指针可在对象的生命周期结束时自动释放内存,从而可以避免我们手动管理内存时因忘记释放造成的内存泄露;
- 简化代码:智能指针可以让开发者不必再调用delete操作符,使代码更加简洁易读
智能指针分为哪几种?
- c++98 提供了auto_ptr 的解决方案;
- c++11 则有unique_ptr、shared_ptr和weak_ptr
智能指针都有什么特点?
1. unique_ptr(安全独生子)
-
特点:
- 独占所有权的智能指针,同一时间只能有一个unique_ptr指向同一个对象;
- 不可复制,只能移动,通过std::move()
- 析构是自动释放分配的内存
-
示例代码:
#include <iostream> #include <memory> using namespace std; int main() { std::unique_ptr<int> p(new int(10)); // std::unique_ptr<int> q = p; // 编译错误,unique_ptr不支持拷贝 std::unique_ptr<int> q = move(p); // 转移所有权,p变为空指针 if (p == nullptr) { std::cout << "p is null after move" << std::endl; // std::cout << *p << std::endl; // 运行时错误,p为空指针 } std::cout << *q << std::endl; // 输出10 return 0; }
输出:
p is null after move 10
2. shared_ptr(共享宝宝)
-
特点:
- 共享所有权的智能指针,多个shared_ptr可以拥有同一个对象,通过引用计数来管理内存;
- 引用计数,表示有多少个shared_ptr指向同一个对象;
- 引用计数为0时释放内存。
-
示例代码:
int main() { std::shared_ptr<int> p(new int(10)); std::shared_ptr<int