C++智能指针总概括

  由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。如果程序员忘记 delete或者流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,这样就会导致内错泄露。

   智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

    智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限、引用计数等,控制权转移等)。


C++ 共提供4中智能指针:auto_ptr、unique_ptr、shared_ptr、weak_ptr

1、auto_ptr

所属头文件:#include <memory>

所属命名空间及标识符:using std::shared_ptr;

所属版本:C++98

g++启用版本命令:g++ -std=c++98 -c -o

补充:

     如果启用c++11及以上标准,即g++ -std=c++11 -c -o,编译时会有一个警告信息提示

warning:‘auto_ptr’ is deprecated  (‘auto_ptr‘被反对使用)

    auto_ptr很好用,被包含在C++标准库中令它在世界范围内被广泛使用,使用智能指针的思想、用法深入人心。但标注库没有覆盖智能指针的全部领域,尤其最重要的引用计数型智能指针。


2、shared_ptr

所属头文件:#include <memory>

所属命名空间及标识符:using std::shared_ptr;

所属版本:C++11

g++启用版本命令:g++ -std=c++11 -c -o

    shared_ptr是一个最像智能指针的“智能指针”,是源自boost库,后被收录到C++11标准的TR1库中。shared_ptr非常有价值、非常重要、非常有用。”在C++历史上曾经出现过无数的引用计数型智能指针实现,但没有一个比得上shared_ptr,在过去、现在和将来,它都是最好的。


3、unique_ptr

所属头文件:#include <memory>

所属命名空间及标识符:using std::shared_ptr;

所属版本:C++11

g++启用版本命令:g++ -std=c++11 -c -o


4、weak_ptr

所属头文件:#include <memory>

所属命名空间及标识符:using std::shared_ptr;

所属版本:C++11

g++启用版本命令:g++ -std=c++11 -c -o

     weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用记数的增加或减少。没有重载*和->但可以使用lock获得一个可用的shared_ptr对象

     weak_ptr的一个重要用途是通过lock获得this指针的shared_ptr,使对象自己能够生产shared_ptr来管理自己,但助手类enable_shared_from_this的shared_from_this会返回this的shared_ptr,只需要让想被shared_ptr管理的类从它继承即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值