智能指针通过自动管理内存解决C++手动管理问题。1. unique_ptr独占所有权,不可复制但可移动,离开作用域自动释放;2. shared_ptr通过引用计数实现共享所有权,最后销毁时释放资源;3. weak_ptr打破循环引用,避免内存泄漏;4. 推荐使用make_unique和make_shared创建,避免裸new,正确传递参数以确保安全高效。

在C++中,手动管理内存容易引发内存泄漏、重复释放等问题。为了解决这些问题,C++11引入了智能指针,其中 std::shared_ptr 和 std::unique_ptr 是最常用的两种。它们通过自动管理对象生命周期,帮助开发者实现资源的安全释放。
std::unique_ptr 表示对所指向对象的唯一所有权。同一时间只能有一个 unique_ptr 指向某个对象,不能复制,但可以移动。
适用于不需要共享资源的场景,比如函数内部创建对象并返回,或类中持有唯一资源。
使用方法:
立即学习“C++免费学习笔记(深入)”;
示例:
#include <memory>
#include <iostream>
struct Resource {
Resource() { std::cout << "Resource acquired\n"; }
~Resource() { std::cout << "Resource destroyed\n"; }
};
void useUniquePtr() {
auto ptr1 = std::make_unique<Resource>(); // 创建
// auto ptr2 = ptr1; // 错误:不能复制
auto ptr2 = std::move(ptr1); // 正确:移动所有权
} // ptr2 离开作用域,资源被释放
std::shared_ptr 使用引用计数机制,多个 shared_ptr 可以共享同一个对象。当最后一个指向对象的 shared_ptr 被销毁时,对象才被释放。
适用于需要多处共享资源的场景,如缓存、观察者模式中的回调对象等。
使用方法:
立即学习“C++免费学习笔记(深入)”;
示例:
#include <memory>
#include <iostream>
void useSharedPtr() {
auto sp1 = std::make_shared<Resource>(); // 引用计数=1
{
auto sp2 = sp1; // 引用计数=2
std::cout << "Ref count: " << sp1.use_count() << "\n"; // 输出 2
} // sp2 离开作用域,计数减为1
} // sp1 离开作用域,计数归0,资源释放
当两个 shared_ptr 相互持有对方时,会导致引用计数永不归零,造成内存泄漏。
解决方案:使用 std::weak_ptr 打破循环。它不增加引用计数,只“观察”对象是否存在。
常见于父子节点、观察者与被观察者关系中。
示例:
#include <memory>
struct Node {
std::shared_ptr<Node> parent;
std::weak_ptr<Node> child; // 避免循环
};
访问 weak_ptr 时需调用 lock() 获取临时 shared_ptr:
auto temp = wp.lock();
if (temp) {
// 使用 temp
}
正确使用智能指针不仅能避免内存问题,还能提升代码可读性和安全性。
基本上就这些。只要坚持使用智能指针管理动态资源,配合 RAII 原则,C++ 的内存管理可以既高效又安全。
以上就是c++++怎么正确使用智能指针shared_ptr和unique_ptr_c++内存管理与资源自动释放指南的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号