应使用 std::vector<std::unique_ptr<int>> 替代 std::vector<int*>:前者自动管理内存、避免悬空指针和泄漏,后者仅管理指针本身,需手动 delete 且易出错。

vector<int*> 能直接用,但必须手动管理内存
定义 std::vector<int></int> 没语法问题,编译能过,但容器只管指针变量本身,不管它指向的 int 内存。常见错误是插入临时对象地址或忘记 delete:
-
int x = 42; vec.push_back(&x);——x出作用域后指针悬空 -
vec.push_back(new int(10));—— 后续不delete就内存泄漏 - 调用
vec.clear()或析构时,指针被销毁,但所指内存还在
用 std::unique_ptr 替代裸指针更安全
std::vector<:unique_ptr>></:unique_ptr> 是推荐做法:容器接管资源生命周期,自动释放,且禁止拷贝(防误传)。注意构造方式:
- 用
std::make_unique<int>(42)构造并 push,别用new手动 new 后再包 - 不能写
vec.push_back(std::unique_ptr<int>(new int(42)))</int>—— 可能异常导致new后未构造成功就泄漏 - 访问元素用
ptr->或*ptr,不是**ptr
std::vector<std::unique_ptr<int>> v; v.push_back(std::make_unique<int>(100)); std::cout << *v[0]; // 输出 100
shared_ptr 适合多处共享所有权的场景
如果多个容器、函数或对象需要同时持有同一块内存,用 std::shared_ptr。但要注意循环引用风险和性能开销(引用计数原子操作):
-
std::vector<:shared_ptr>></:shared_ptr>允许拷贝、赋值,引用计数自动增减 - 避免在同一个对象里用
shared_ptr和weak_ptr交叉持有,否则可能形成循环引用 - 不要把
shared_ptr和裸指针混用 —— 比如用new分配后分别塞进shared_ptr和存到裸指针变量里,会 double-free
map/set 存指针需自定义比较逻辑
默认按指针值(地址)排序,不是按所指内容。若想按 int 值排序,必须传比较器:
立即学习“C++免费学习笔记(深入)”;
-
std::set<int std::less<>></int>→ 按地址升序(通常无意义) - 正确做法:
std::set<:unique_ptr>, decltype(cmp)></:unique_ptr>配合 lambda 比较*a和*b - 用
std::map<std::string, std::unique_ptr<Data>>是常见模式,key 用值语义,value 用智能指针管理堆对象
最易忽略的是:一旦用了智能指针,就别再混用 new/delete,否则资源归属立刻混乱。


















