c++ - 在类成员中正确使用 unique_ptr

标签 c++ c++11 c++14 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;
}

最佳答案

您的代码工作正常(虽然冗余* 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() 表达式的结果已经是一个右值。

关于c++ - 在类成员中正确使用 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42595473/

相关文章:

c++ - 为什么我在从 char 转换为 char 时出错?

c++ - 奇怪的类型名用法 c++11

c++ - 未调用基类构造函数?

c++ - CMake 链接库在 Docker 镜像中失败

c++ - 模板模板类中非类型参数的类型在 C++14 中不可推导,但在 C++17 中可推导

c++ - 每台显示器显示不同的图像 directX 10

c++ - 比较两个 CGPDFDictionary

c++ - C++ 中的释放(指针 vector 数组)

c++ - 如何 std::hash 一个无序的 std::pair

c++ - 模板实例化期间函数定义的顺序