当前位置:  开发笔记 > 编程语言 > 正文

使用重置初始化unique_ptr是一个坏习惯吗?

如何解决《使用重置初始化unique_ptr是一个坏习惯吗?》经验,为你挑选了1个好方法。

当我需要一个std :: unique_ptr类型的数据成员时,我通常使用std :: unique :: reset来用一个新对象初始化这个unique_ptr.

以下是一个简化示例:

class A {
 public:
  void SetValue(int x) {
    data_.reset(new B(x));
  }

 private:
  std::unique_ptr data_;
};

在代码审查中,一位评论者提到这是一个坏习惯,他要求我尽可能不使用重置.相反,他建议使用以下方法:

std::make_unique

或模板函数如下:

template 
struct MakeUniqueResult {
  using scalar = std::unique_ptr;
};
template 
typename internal::MakeUniqueResult::scalar
MakeUnique(Args&&... args) {  
  return std::unique_ptr(
      new T(std::forward(args)...));  
}

在上述情况下是否有一些特殊原因可以避免使用std :: unique_ptr :: reset?



1> Adrian McCar..:

在您的示例中,无论您使用std::make_unique还是std::unique_ptr::reset使用new ,效果都是相同的.

但是在更有趣的代码中,使用std::make_unique解决了一些异常安全问题,这就是为什么你的代码审查者建议让它成为一种习惯.

考虑如果您尝试一次创建两个唯一指针会发生什么:

Frobnicate(std::unique_ptr(new Foo), std::unique_ptr(new Bar(3)));

编译器必须做大量的工作来创建这两个参数,并且它具有很大的灵活性,它可以做到这一点.如果其中一个构造函数抛出异常,则为另一个分配的内存可能会被清除,也可能不会被清除.

但是如果你使用std::make_unique:

Frobnicate(std::make_unique(), std::make_unique(3));

临时的unique_ptrs将立即拥有各自的对象,因此如果创建另一个对象会抛出异常,则可以清除它们.

对于异常安全以及避免直接使用new和delete的一般原则,std::make_unique每次使用都是一个好习惯.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有