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

c – 使用重置初始化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<B> 当我需要一个std :: unique_ptr类型的数据成员时,我通常使用std :: unique :: reset来用一个新对象初始化这个unique_ptr.

以下是一个简化示例:

class A { public:  voID SetValue(int x) {    data_.reset(new B(x));  } private:  std::unique_ptr<B> data_;};

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

std::make_unique

或模板函数如下:

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

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

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

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

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

Frobnicate(std::unique_ptr<Foo>(new Foo),std::unique_ptr<bar>(new bar(3)));

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

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

Frobnicate(std::make_unique<Foo>(),std::make_unique<bar>(3));

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

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

总结

以上是内存溢出为你收集整理的c – 使用重置初始化unique_ptr是一个坏习惯吗?全部内容,希望文章能够帮你解决c – 使用重置初始化unique_ptr是一个坏习惯吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1243575.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存