智能指针(C++)


前言

智能指针是一种在C++中用于管理动态分配的内存的类。它们封装了原始指针,提供了自动化的内存管理,帮助避免内存泄漏和野指针等常见问题。
C++标准库提供了几种类型的智能指针,主要包括std::unique_ptr、std::shared_ptr和std::weak_ptr。


1. std::unique_ptr

std::unique_ptr 是一种独占所有权的智能指针,保证同一时间只有一个unique_ptr拥有对对象的控制权。当unique_ptr被销毁时,它指向的对象也会被删除。它不能被复制到其他unique_ptr对象,防止多个指针指向同一个资源,但可以通过移动语义(std::move)转移所有权。
使用std::make_unique(C++14及以后版本推荐的方式)或者直接使用unique_ptr的构造函数来创建和初始化unique_ptr。
示例代码:

#include <memory>
// 推荐方式
auto ptr = std::make_unique<int>(10); // 创建一个指向int的unique_ptr,初始化为10

// 使用构造函数
std::unique_ptr<int> uptr(new int(10)); // 创建一个指向int的unique_ptr,初始化为10

2. std::shared_ptr

std::shared_ptr 允许多个shared_ptr实例共享对同一对象的所有权。它使用引用计数机制来跟踪有多少个shared_ptr指向同一个资源,当最后一个shared_ptr被销毁时,资源才会被释放。这种智能指针适用于资源共享的情况。
使用std::make_shared(推荐方式)或shared_ptr的构造函数来创建和初始化shared_ptr。
示例代码:

#include <memory>

auto ptr = std::make_shared<int>(10); // 创建一个指向int的shared_ptr,初始化为10

std::shared_ptr<int> sptr(new int(10)); // 不推荐,但有效

3. std::weak_ptr

std::weak_ptr 是一种不拥有所有权的智能指针,它指向由std::shared_ptr管理的对象。它被设计用来解决std::shared_ptr相互引用时可能导致的循环引用问题,从而避免内存泄漏。
weak_ptr需要被转换成std::shared_ptr来访问资源。
示例代码:

#include <iostream>
#include <memory>

int main() {
    std::shared_ptr<int> sharedPtr = std::make_shared<int>(10);
    std::weak_ptr<int> weakPtr = sharedPtr; // 创建一个weak_ptr指向sharedPtr管理的对象

    // 尝试将weak_ptr转换为shared_ptr
    std::shared_ptr<int> sharedPtr2 = weakPtr.lock();

    if (sharedPtr2) {
        // 转换成功,sharedPtr2不为空
        std::cout << "sharedPtr2指向的值: " << *sharedPtr2 << std::endl;
    } else {
        // 转换失败,sharedPtr2为空
        std::cout << "对象已被删除" << std::endl;
    }

    return 0;
}

weak_ptr需要通过已存在的shared_ptr或另一个weak_ptr来初始化。
示例代码:

#include <memory>

auto sharedPtr = std::make_shared<int>(10); // 首先创建一个shared_ptr
std::weak_ptr<int> weakPtr(sharedPtr); // 通过shared_ptr初始化weak_ptr


总结

C++11引入了std::unique_ptr、std::shared_ptr和std::weak_ptr,以及相关功能,如std::make_shared和后来在C++14中加入的std::make_unique。这些智能指针大大简化了资源管理,特别是内存管理,帮助开发者避免内存泄漏和指针相关的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值