gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:26 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com