C++11智能指针:从入门到精通,什么是 Apache Ignite?。

C++11智能指针(上):理解与基础用法

智能指针的诞生背景

C++11引入智能指针的主要目的是解决传统裸指针(raw pointer)的内存管理问题。裸指针需要手动管理内存分配与释放,容易导致内存泄漏或重复释放等问题。智能指针通过自动化的内存管理机制,显著提升了代码的安全性和可维护性。

智能指针的核心类型

C++11标准库提供了三种主要的智能指针模板类:std::unique_ptrstd::shared_ptrstd::weak_ptr。它们均定义在<memory>头文件中,具有不同的所有权语义和使用场景。

unique_ptr:独占所有权指针

std::unique_ptr实现了独占式所有权模型,同一时刻只能有一个unique_ptr指向特定对象。当unique_ptr被销毁时,其所占有的对象也会自动被销毁。

std::unique_ptr<int> ptr(new int(42)); // 创建独占指针
// std::unique_ptr<int> ptr2 = ptr;  // 错误:不允许复制
std::unique_ptr<int> ptr2 = std::move(ptr); // 允许所有权转移

使用make_unique(C++14引入)可以更安全地创建unique_ptr

auto ptr = std::make_unique<int>(42); // 推荐用法
shared_ptr:共享所有权指针

std::shared_ptr通过引用计数实现共享所有权,多个shared_ptr可以指向同一个对象。当最后一个shared_ptr被销毁时,对象才会被释放。

std::shared_ptr<int> ptr1(new int(42)); // 创建共享指针
std::shared_ptr<int> ptr2 = ptr1;      // 合法:引用计数增加

推荐使用make_shared创建:

auto ptr = std::make_shared<int>(42); // 更高效的内存分配
weak_ptr:弱引用指针

std::weak_ptrshared_ptr的配套工具,它不增加引用计数,主要用于解决shared_ptr的循环引用问题。需要通过lock()方法获取可用的shared_ptr

std::shared_ptr<int> sp = std::make_shared<int>(42);
std::weak_ptr<int> wp = sp; // 创建弱引用
if (auto tmp = wp.lock()) { // 尝试提升为shared_ptr
    // 使用tmp访问对象
}
智能指针的内存管理机制

所有智能指针都遵循RAII(Resource Acquisition Is Initialization)原则。在构造函数中获取资源,在析构函数中释放资源。unique_ptr默认使用delete释放资源,shared_ptr可自定义删除器:

// 自定义删除器示例
auto deleter = [](FILE* fp) { fclose(fp); };
std::unique_ptr<FILE, decltype(deleter)> fp(fopen("test.txt", "r"), deleter);
选择适当的智能指针
  • 优先使用unique_ptr:默认选择,性能开销最小
  • 需要共享所有权时用shared_ptr
  • 解决循环引用问题用weak_ptr
  • 避免混合使用裸指针和智能指针
典型错误用法示例
int* raw_ptr = new int(42);
std::shared_ptr<int> sp1(raw_ptr);
std::shared_ptr<int> sp2(raw_ptr); // 错误:会导致重复释放

正确做法是始终让智能指针管理裸指针,不直接使用裸指针。

性能考量

智能指针会带来少量运行时开销:

  • unique_ptr几乎没有额外开销
  • shared_ptr需要维护引用计数
  • weak_ptr需要在提升时检查引用计数

在性能关键代码中应谨慎评估使用代价。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值