IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++智能指针 -> 正文阅读

[C++知识库]C++智能指针

1 智能指针是什么?智能指针的原理

a smart pointer is a class template that you declare on the stack, and initialize by using a raw pointer that points to a heap-allocated object. After the smart pointer is initialized, it owns the raw pointer. This means that the smart pointer is responsible for deleting the memory that the raw pointer specifies. The smart pointer destructor contains the call to delete, and because the smart pointer is declared on the stack, its destructor is invoked when the smart pointer goes out of scope, even if an exception is thrown somewhere further up the stack.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??Smart pointers (Modern C++) | Microsoft Docs

智能指针是一个模板类,这个类的构造函数传入一个普通的指针,析构函数释放传入的指针。智能指针上的类都是栈上的对象,所以当函数或者程序结束时就会自动释放。

2 常用智能指针

  • unique_ptr?

? ? ? ??unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。unique_ptr支持不可复制,赋值,但可以move()转移对象的所有权,局部变量的返回值除外

智能指针实现重点:

  • 移动构造、移动赋值问题
  • 阻止拷贝构造与拷贝赋值
template<class T>
class myUniquePtr{
private:
    T *m_ptr;
public:
    explicit myUniquePtr(T* ptr= nullptr):m_ptr(ptr) {}
    ~myUniquePtr(){
        if(m_ptr)
            delete m_ptr;
    }
    myUniquePtr(const myUniquePtr&) = delete;
    myUniquePtr& operator=(const myUniquePtr &p) =delete;
    T* operator*() const{return *m_ptr;}
    T& operator->() const{return m_ptr;}
    myUniquePtr(myUniquePtr &&p):m_ptr(p.m_ptr){p.m_ptr= nullptr;}
    myUniquePtr& operator=(myUniquePtr &&p){
        swap(*this,p);//采用swap函数实现移动赋值
        return *this;
    }
    explicit operator bool() const {return m_ptr;}
    void reset(T* q = nullptr){
        if(q!=m_ptr){
            if(m_ptr)
                delete m_ptr;
            m_ptr = q;
        }
    }
    T* release(){
        T* res = m_ptr;
        m_ptr = nullptr;
        return res;
    }
    T* get(){
        return m_ptr;
    }
    void swap(myUniquePtr &p){
        std::swap(m_ptr,p.m_ptr);
    }
};
  • shared_ptr

? ? ? ? shared_ptr 是引用计数型(reference counting)智能指针,几乎所有的实现都采用在堆(heap)上放个计数值(count)的办法。具体来说,shared_ptr<Foo> 包含两个成员,一个是指向 Foo 的指针 ptr,另一个是 ref_count 指针,指向堆上的 ref_count 对象,ref_count 对象有多个成员。

? ? ? ? shared_ptr是否线程安全,如何实现线程安全?

? ? ? ? 结论:多个线程同时读同一个shared_ptr对象是线程安全的,但是如果是多个线程对同一个shared_ptr对象进行读和写,则需要加锁。

? ? ? ? 为什么尽可能使用make_shared()?? ? ??

????????为了节省一次内存分配,原来 shared_ptr<Foo> x(new Foo); 需要为 Foo 和 ref_count 各分配一次内存,现在用 make_shared() 的话,可以一次分配一块足够大的内存,供 Foo 和 ref_count 对象容身。

  • weak_ptr? ? ? ? ? ? ? ? ?

? ? ? ? shared_ptr存在互相引用形成环的问题,这样子两个指针指向的内存都无法释放,需要手动打破循环引用或者是使用weak_ptr。weak_ptr是一个弱引用,只引用不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构之后,不管还有没有weak_ptr应用该内存,内存都会被释放掉。所以weak_ptr不保证其指向的内容是有效的,在使用前需要检查weak_ptr是否为空指针。

参考资料?

shared_ptr的线程安全性 - gqtc - 博客园

C++11智能指针(五):shared_ptr的循环引用的问题及weak_ptr_小麒麟的成长之路-CSDN博客 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-27 12:39:41  更:2021-10-27 12:41:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:16:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码