在类成员中正确使用 unique_ptr

新手上路,请多包涵

我正在尝试真正从 c++98 迁移到 c++11 及更高版本。我已经了解了大部分新内容,但我仍然不确定 unique_ptr 的正确用法。

考虑下面的示例,其中类 A 有一个 unique_ptr 成员(我之前会使用原始指针!)。当用户需要时,应该通过在其他地方(不是类的一部分)调用函数来分配这个成员变量。这是正确的用法吗?如果没有,最好的选择是什么?

 class A {
private:
   unique_ptr<MyType> mt;
public:
   void initStuff() {
      mt.reset(std::move(StaticFuncSomewhereElese::generateMyType()));
   }
};

MyType* StaticFuncSomewhereElese::generateMyType() {
    MyType* temp = new MyType(...);
    //do stuff to temp (read file or something...)
    return temp;
}

原文由 EMBEDONIX 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

您的代码工作正常(尽管可以省略冗余\* move ),但最好尽早构造 unique_ptr

 class A {
private:
   std::unique_ptr<MyType> mt;
public:
   void initStuff() {
      mt = StaticFuncSomewhereElese::generateMyType();
   }
};

std::unique_ptr<MyType> StaticFuncSomewhereElese::generateMyType() {
    auto temp = std::make_unique<MyType>(…);
    // `make_unique` is C++14 (although trivially implementable in C++11).
    // Here's an alternative without `make_unique`:
    // std::unique_ptr<MyType> temp(new MyType(…));

    //do stuff to temp (read file or something...)
    return temp;
}

这样很明显,调用者必须删除 generateMyType 的返回值,并且内存泄漏的可能性较小(例如如果 generateMyType 提前返回)。

\* move 是多余的,因为:

  1. 无法移动原始指针。
  2. generateMyType() 表达式的结果无论如何已经是一个右值。

原文由 emlai 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题