前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sole Ownership-The Boost C++ Libraries

Sole Ownership-The Boost C++ Libraries

作者头像
ccf19881030
发布2020-05-18 17:18:25
6220
发布2020-05-18 17:18:25
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客

The Boost C++ Libraries

Sole Ownership

boost::scoped_ptr是动态分配对象的唯一所有者的智能指针。boost::scoped_ptr无法复制或移动。此智能指针在头文件boost/scoped_ptr.hpp中定义。

示例 1.1. 使用boost::scoped_ptr

#include <boost/scoped_ptr.hpp>
#include <iostream>

int main()
{
  boost::scoped_ptr<int> p{new int{1}};
  std::cout << *p << '\n';
  p.reset(new int{2});
  std::cout << *p.get() << '\n';
  p.reset();
  std::cout << std::boolalpha << static_cast<bool>(p) << '\n';
}

类型为boost::scoped_ptr的智能指针无法转移对象的所有权。使用地址初始化后,在执行析构函数或调用成员函数reset()时会释放动态分配的对象。

例1.1使用类型为boost::scoped_ptr的智能指针p。用指向存储数字1的动态分配对象的指针初始化p。通过运算符*,取消引用p并将1写入标准输出。

使用reset()可以在智能指针中存储一个新地址,该示例将新分配的包含数字2的int对象的地址传递给p。通过调用reset(),p中当前引用的对象为自动销毁。

get()返回锚定在智能指针中的对象的地址,该示例取消引用get()返回的地址以将2写入标准输出。

boost::scoped_ptr重载了运算符布尔运算符。如果智能指针包含对对象的引用(即不为空),则运算符布尔运算符将返回true。该示例将false写入标准输出,因为p已通过调用重置重设()。

boost::scoped_ptr的析构函数使用delete释放引用的对象。这就是为什么boost::scoped_ptr不能使用动态分配的数组的地址进行初始化的原因,而必须使用delete []来释放该数组。对于数组,Boost.SmartPointers提供类boost ::scoped_array。

示例 1.2. 使用boost::scoped_array

#include <boost/scoped_array.hpp>

int main()
{
  boost::scoped_array<int> p{new int[2]};
  *p.get() = 1;
  p[1] = 2;
  p.reset(new int[3]);
}

智能指针boost::scoped_array的用法与boost::scoped_ptr相似,主要区别在于boost::scoped_array的析构函数使用运算符delete []释放包含的对象,因为此运算符仅适用于数组,因此boost: 注意:scoped_array必须使用动态分配的数组的地址进行初始化。

boost::scoped_array在boost/scoped_array.hpp中定义。

boost::scoped_array为操作符[]和布尔操作符bool提供了重载,使用operator []可以访问数组的特定元素,因此,类型为boost::scoped_array的对象的行为就像其拥有的数组一样。 数字2作为p引用的数组中的第二个元素。

像boost::scoped_ptr一样,提供了成员函数get()和reset()来检索和重新初始化所包含对象的地址。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • The Boost C++ Libraries
  • Sole Ownership
    • 示例 1.1. 使用boost::scoped_ptr
      • 示例 1.2. 使用boost::scoped_array
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档