• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
1 智能指针

 

std::shared_ptr 介绍

std::shared_ptr是 C++11 引入的智能指针之一,用于管理动态分配对象的生命周期,通过引用计数机制实现共享所有权。

基本特性

  1. ​​共享所有权​​:多个 shared_ptr可以共同拥有同一个对象

  2. ​​自动释放​​:当最后一个 shared_ptr被销毁时,它所管理的对象会被自动删除

  3. ​​线程安全​​:引用计数操作是原子操作,线程安全(但管理的对象本身不是线程安全的)

#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructed\n"; }
    ~MyClass() { std::cout << "MyClass destroyed\n"; }
    void doSomething() { std::cout << "Doing something\n"; }
};

int main() {
    // 创建 shared_ptr
    std::shared_ptr<MyClass> ptr1(new MyClass());
    
    // 使用 make_shared 更高效(推荐方式)
    auto ptr2 = std::make_shared<MyClass>();
    
    // 共享所有权
    std::shared_ptr<MyClass> ptr3 = ptr2;
    
    // 使用指针
    ptr1->doSomething();
    (*ptr2).doSomething();
    
    // 获取原始指针(谨慎使用)
    MyClass* rawPtr = ptr3.get();
    
    // 重置指针
    ptr1.reset();  // 释放所有权
    
    // 检查是否有所有权
    if (ptr1) {
        std::cout << "ptr1 owns an object\n";
    } else {
        std::cout << "ptr1 is empty\n";
    }
    
    return 0;
    // ptr2 和 ptr3 离开作用域,对象被自动销毁
}

  

注意事项

  1. ​​避免循环引用​​:可能导致内存泄漏,可使用 std::weak_ptr解决

class B;
class A {
    std::shared_ptr<B> b_ptr;
};
class B {
    std::shared_ptr<A> a_ptr;  // 循环引用
};

  

优先使用 make_shared​​:更高效(单次内存分配),且更安全

auto p = std::make_shared<int>(42);  // 推荐

  

  1. 不适用于数组​​(C++17 前):管理数组应使用 std::shared_ptr<T[]>(C++17)或 std::vector

std::shared_ptr是 C++ 中管理动态内存的强大工具,正确使用可以大大减少内存泄漏的风险。

posted on 2025-08-06 21:52  MKT-porter  阅读(10)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3