C++11 智能指针【详解+实现】【面试常考】 您所在的位置:网站首页 智能指针实现方式 C++11 智能指针【详解+实现】【面试常考】

C++11 智能指针【详解+实现】【面试常考】

2023-06-21 09:31| 来源: 网络整理| 查看: 265

文章目录 一、原始指针容易发生内存泄漏二、使用构造函数和析构函数解决内存泄漏三、shared_ptr共享的智能指针四、weak_ptr弱引用的智能指针五、unique_ptr独占的智能指针六、性能与安全的权衡七、智能指针的简单实现八、附录:全部代码

一、原始指针容易发生内存泄漏

C++ 程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。但使用普通指针,容易造成内存泄露(忘记释放)、二次释放、程序发生异常时内存泄露等问题等。所以 C++11 就引入了智能指针。

C 语言中最常使用的是malloc()函数分配内存,free()函数释放内存,而 C++ 中对应的是new、delete关键字。malloc()只是分配了内存,而new则更进一步,不仅分配了内存,还调用了构造函数进行初始化。

二、使用构造函数和析构函数解决内存泄漏

C++ 中的构造函数和析构函数十分强大,可以使用构造和析构解决上面的内存泄漏问题。就算发生了异常,也能够保证析构函数成功执行。但是在多个引用和多线程的时候还是会出现问题。

C++11 中引入了智能指针(Smart Pointer),它利用了一种叫做 RAII(资源获取即初始化)的技术将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。这使得智能指针实质是一个对象,行为表现的却像一个指针。

智能指针主要分为shared_ptr、unique_ptr和weak_ptr三种,使用时需要引用头文件。C++98 中还有auto_ptr,基本被淘汰了,不推荐使用。而 C++11 中shared_ptr和weak_ptr都是参考boost库实现的。

三、shared_ptr共享的智能指针 // 初始化 shared_ptr p1 = make_shared(42); shared_ptr p2(new int(1024)); shared_ptr p3 = p2; // 获取值 cout ref_count_, rhs.ref_count_); std::swap(this->mutex_, rhs.mutex_); } private: // 增加引用计数 void addRefCount() { mutex_->lock(); ++(*ref_count_); mutex_->unlock(); } // 减少引用计数,如果为零,则释放指针 void decrRefCount() { bool deleteflag = false; mutex_->lock(); if (--(*ref_count_) == 0) { delete ptr_; delete ref_count_; deleteflag = true; } mutex_->unlock(); if (deleteflag) { delete mutex_; } } }; // 函数模板 template auto make_Shared(T v) { return Shared_ptr{new T(v)}; } 八、附录:全部代码 /******************** 单元测试 ********************/ #include #include using namespace std; int main() { // make_Shared { Shared_ptr p1 = make_Shared(42); Shared_ptr p2 = p1; cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有