评论

收藏

[C++] unique_ptr和make_unique在electron中的使用

编程语言 编程语言 发布于:2021-07-22 15:59 | 阅读数:364 | 评论:0

目录
引言
正文

引言
C++11标准库提供了两种智能指针,它们的区别在于管理底层指针的方式:shared_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指向的对象。C++11标准库还定义了一个名为weak_ptr的辅助类,它是一种弱引用,指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中。智能指针是模板类而不是指针。类似vector,智能指针也是模板,当创建一个智能指针时,必须提供额外的信息即指针可以指向的类型。默认初始化的智能指针中保存着一个空指针。智能指针的使用方式与普通指针类似。如果在一个条件判断中使用智能指针,效果就是检测它是否为空。

正文
unique_ptr在使用过程中主要注意的有两点,接下来进行介绍。
一、无法进行复制构造和赋值操作
unique_ptr没有copy构造函数,不支持普通的拷贝和赋值操作。
int main() 
{
  // 创建一个unique_ptr实例
  unique_ptr<int> pInt(new int(666));
  unique_ptr<int> pInt2(pInt);  // 报错
  unique_ptr<int> pInt3 = pInt;   // 报错
}
二、可以进行移动构造和移动赋值操作 
unique_ptr虽然不支持普通的拷贝和赋值操作,但却提供了一种移动机制来将指针的所有权从一个unique_ptr转移给另一个unique_ptr。如果需要转移所属权,可以使用std::move()函数。
int main() 
{
  unique_ptr<int> pInt(new int(888));
  unique_ptr<int> pInt2 = std::move(pInt);  // 转移所有权
  //cout << *pInt << endl; // 出错,pInt为空
  cout << *pInt2 << endl;
  unique_ptr<int> pInt3(std::move(pInt2));
}
Electron中的具体应用如下所示 :
.h头文件
std::unique_ptr<DesktopMediaList> window_capturer_;
.cc文件
window_capturer_ = std::make_unique<NativeDesktopMediaList>(
  content::DesktopMediaID::TYPE_WINDOW,
  content::desktop_capture::CreateWindowCapturer());
window_capturer_->SetThumbnailSize(thumbnail_size);
window_capturer_->AddObserver(this);
window_capturer_->Update(base::BindOnce(
  &DesktopCapturer::UpdateSourcesList, weak_ptr_factory_.GetWeakPtr(),
  window_capturer_.get()));

关注下面的标签,发现更多相似文章