C++智能指针

摘自 http://technet.microsoft.com/zh-cn/magazine/hh279674.aspx

概述

智能指针是在 <memory> 标头文件中的 std 命名空间中定义的。 它们对 RAII 或“获取资源即初始化”编程惯用法至关重要。 此习惯用法的主要目的是确保资源获取与对象初始化同时发生,从而能够创建该对象的所有资源并在某行代码中准备就绪。 实际上,RAII 的主要原则是为将任何堆分配资源(例如,动态分配内存或系统对象句柄)的所有权提供给其析构函数包含用于删除或释放资源的代码以及任何相关清理代码的堆栈分配对象。

大多数情况下,当初始化原始指针或资源句柄以指向实际资源时,会立即将指针传递给智能指针。 在现代 C++ 中,原始指针仅用于范围有限的小代码块、循环或者性能至关重要且不会混淆所有权的 Helper 函数中。

注意:应始终在单独的代码行上创建智能指针,而绝不在参数列表中创建智能指针,这样就不会由于某些参数列表分配规则而发生轻微泄露资源的情况。

一些 STL 智能指针具有释放指针所有权的重置成员函数。

智能指针通常提供直接访问其原始指针的方法。 STL 智能指针拥有一个用于此目的的 get成员函数,CComPtr 拥有一个公共的 p 类成员。 通过提供对基础指针的直接访问,你可以使用智能指针管理你自己的代码中的内存,还能将原始指针传递给不支持智能指针的代码。

类型

C++ 标准库智能指针

使用这些智能指针作为将指针封装为纯旧 C++ 对象 (POCO) 的首选项。

  • unique_ptr 
    只允许基础指针的一个所有者。 除非你确信需要 shared_ptr,否则请将该指针用作 POCO 的默认选项。 可以移到新所有者,但不会复制或共享。 替换已弃用的auto_ptr 与 boost::scoped_ptr 比较。 unique_ptr 小巧高效;大小等同于一个指针且支持 rvalue 引用,从而可实现快速插入和对 STL 集合的检索。 

  • shared_ptr 
    采用引用计数的智能指针。 如果你想要将一个原始指针分配给多个所有者(例如,从容器返回了指针副本又想保留原始指针时),请使用该指针。 直至所有shared_ptr 所有者超出了范围或放弃所有权,才会删除原始指针。 大小为两个指针;一个用于对象,另一个用于包含引用计数的共享控制块。 

  • weak_ptr 
    结合 shared_ptr 使用的特例智能指针。 weak_ptr 提供对一个或多个 shared_ptr 实例拥有的对象的访问,但不参与引用计数。 如果你想要观察某个对象但不需要其保持活动状态,请使用该实例。 在某些情况下,需要断开 shared_ptr 实例间的循环引用。

COM 对象的智能指针(经典 Windows 编程)

当你使用 COM 对象时,请将接口指针包装到适当的智能指针类型中。 活动模板库 (ATL) 针对各种目的定义了多种智能指针。 你还可以使用 _com_ptr_t 智能指针类型,编译器在从 .tlb 文件创建包装器类时会使用该类型。 无需包含 ATL 标头文件时,它是最好的选择。

CComPtr 类

除非你无法使用 ATL,否则使用此类型。 使用 AddRef 和 Release 方法执行引用计数。

CComQIPtr 类

类似于 CComPtr,但还提供了用于在 COM 对象上调用 QueryInterface 的简化语法。 

CComHeapPtr 类

指向使用 CoTaskMemFree 释放内存的对象的智能指针。

CComGITPtr 类

从全局接口表 (GIT) 获取的接口的智能指针。

_com_ptr_t 类

在功能上类似于 CComQIPtr,但不依赖于 ATL 标头。

POCO 对象的 ATL 智能指针

除 COM 对象的智能指针外,ATL 还为纯旧 C++ 对象定义了智能指针和智能指针集合。 在经典 Windows 编程中,这些类型可用于替代 STL 集合,尤其是不要求代码可移植性或不需要混合 STL 和 ATL 的编程模型时。

CAutoPtr 类

通过转移副本所有权增强唯一所有权的智能指针。 等同于已弃用的 std::auto_ptr 类。

CHeapPtr 类

使用 C malloc 函数分配的对象的智能指针。

CAutoVectorPtr 类

使用 new[] 分配的数组的智能指针。

CAutoPtrArray 类

封装一个 CAutoPtr 元素数组的类。

CAutoPtrList 类

封装用于操作 CAutoPtr 节点列表的方法的类。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值