商城首页欢迎来到中国正版软件门户

您的位置:首页 >C++ shared_ptr使用与详解

C++ shared_ptr使用与详解

  发布于2025-12-13 阅读(0)

扫一扫,手机访问

std::shared_ptr通过引用计数管理动态对象,使用make_shared创建并共享所有权,引用计数为0时自动释放资源;可自定义删除器处理特殊资源;需用weak_ptr打破循环引用以防内存泄漏。

c++怎么使用shared_ptr_c++ shared_ptr智能指针详解

在C++中,std::shared_ptr 是一种智能指针,用于管理动态分配的对象,实现共享所有权的机制。它通过引用计数自动追踪有多少个 shared_ptr 指向同一个对象,当最后一个指向该对象的 shared_ptr 被销毁或重置时,对象会自动被删除,从而避免内存泄漏。

1. 包含头文件和基本用法

要使用 shared_ptr,需要包含 <memory> 头文件:

#include <memory>
#include <iostream>

创建一个 shared_ptr 的常用方式是使用 std::make_shared,这是推荐的做法,因为它更高效且异常安全:

auto ptr = std::make_shared<int>(42);
std::cout << *ptr << std::endl; // 输出 42

2. 共享所有权与引用计数

多个 shared_ptr 可以指向同一个对象,每增加一个引用,引用计数加1;减少一个则减1。

auto p1 = std::make_shared<int>(100);
{
    auto p2 = p1; // 引用计数变为 2
    std::cout << "引用计数: " << p1.use_count() << std::endl; // 输出 2
} // p2 离开作用域,引用计数减为 1
std::cout << "p2 销毁后引用计数: " << p1.use_count() << std::endl; // 输出 1

use_count() 返回当前对象的引用数量,仅用于调试,不要依赖它做逻辑判断。

3. 自定义删除器

有时需要自定义资源释放逻辑,比如关闭文件、释放非new分配的内存等,可以传入删除器:

void close_file(FILE* fp) {
    if (fp) fclose(fp);
}

auto file_ptr = std::shared_ptr<FILE>(fopen("test.txt", "w"), close_file);
if (file_ptr) {
    fprintf(file_ptr.get(), "Hello, shared_ptr!\n");
} // 离开作用域时自动调用 close_file

删除器可以是函数、lambda 或仿函数。

4. 注意循环引用问题

当两个对象通过 shared_ptr 相互持有对方时,引用计数永远不为0,导致内存泄漏:

struct Node;
using NodePtr = std::shared_ptr<Node>;

struct Node {
    NodePtr parent;
    NodePtr child;
    ~Node() { std::cout << "Node destroyed\n"; }
};

auto a = std::make_shared<Node>();
auto b = std::make_shared<Node>();
a->child = b;
b->parent = a; // 循环引用,无法释放

解决方法是使用 std::weak_ptr 打破循环:

struct Node {
    std::weak_ptr<Node> parent; // 不增加引用计数
    NodePtr child;
    ~Node() { std::cout << "Node destroyed\n"; }
};

这样当外部引用消失时,对象能被正确释放。

基本上就这些。合理使用 shared_ptr 能显著提升代码安全性,但要注意避免循环引用,优先使用 make_shared 创建实例。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注