我正在尝试真正从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;
}

最佳答案

您的代码运行良好(尽管可以省略多余的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是多余的,因为:
  • 无法移动原始指针。
  • 无论如何,generateMyType()表达式的结果已经是右值。
  • 10-08 11:55