C++ 中智能指针的用法

在 C++ 中,智能指针是一种封装了动态分配内存的指针类,它们能够自动处理分配和释放内存的操作,从而避免出现内存泄漏的问题。C++ 中的智能指针有三种:std::unique_ptrstd::shared_ptrstd::weak_ptrauto_ptr 在 C++11 中被摈弃)。它们的具体用法如下:

  • std::unique_ptr

std::unique_ptr 能自动释放动态分配的对象,以达到避免内存泄漏的目的。该类的特点是:只有一个 std::unique_ptr 类型的指针可以指向其封装的指针对象,这就意味着一个 std::unique_ptr 类型的指针不能被复制,但可以被移动(即所有权可以转移)。以下是一个示例:

std::unique_ptr<int> ptr(new int(3)); // 声明一个 std::unique_ptr,将其初始化为指向堆上分配的 int 类型对象
std::cout << *ptr << std::endl; // 输出 3
  • std::shared_ptr

std::shared_ptr 是一个可共享的指针类,它可以使多个指针指向同一个指针对象,以达到共享资源的目的。同时,该类也能自动处理动态分配对象的内存释放,以避免内存泄漏。以下是一个示例:

std::shared_ptr<int> ptr1(new int(4)); // 声明并初始化一个 std::shared_ptr,它指向堆上分配的 int 类型对象,其计数器初始化为 1
std::shared_ptr<int> ptr2 = ptr1; // 通过构造函数将 ptr2 初始化为 ptr1 的副本,此时 ptr1 和 ptr2 指向同一个对象,其计数器为 2
std::cout << *ptr1 << "," << *ptr2 << std::endl; // 输出 4,4

// 当超出 ptr1 和 ptr2 的作用域时,其引用计数会减少 1,当计数为 0 时,自动释放堆内存
  • std::weak_ptr

std::weak_ptr 允许您在不影响引用计数的情况下,以非剥夺方式获得与 std::shared_ptr 具有相同目的的对象引用。可以使用 std::weak_ptr 防止引用计数循环引用。以下是一个示例:

std::weak_ptr<int> wp;
{ // 内嵌作用域
    std::shared_ptr<int> sp(new int(5)); // 声明并初始化一个 std::shared_ptr,它指向堆上分配的 int 类型对象,其计数器初始化为 1
    wp = sp; // 使用 std::weak_ptr 初始化一个分离的引用,此时 sp 和 wp 指向同一个对象,其计数器为 1
    std::cout << "wp: " << *wp.lock() << std::endl; // 输出 wp 所指向的对象的值,即 5,使用 weak_ptr::lock 获得 shared_ptr,调用 shared_ptr 的操作符 * 访问值
} // sp 离开作用域,并自动释放堆内存
std::cout << "wp: " << (wp.expired() ? "expired" : "alive") << std::endl; // 输出 wp 是否引用了已释放的堆内存

在使用智能指针时,通常可以使用 std::make_uniquestd::make_shared 来分配动态内存。例如:

std::unique_ptr<Foo> fooPtr = std::make_unique<Foo>();
std::shared_ptr<Foo> fooSharedPtr = std::make_shared<Foo>();

make_unique 的具体用法
以上便简单介绍了 C++ 中智能指针的用法。需要注意的是,智能指针不是万能的,它们只是一种编写更安全和简单代码的方法,而不是一个解决所有内存管理问题的魔法解决方案。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值