【发布时间】:2021-09-10 17:59:34
【问题描述】:
我偶然发现了这样的代码:
void foo(T* bar); // Note: takes ownership of 'bar'.
foo(new T());
现在我想知道将其重构为:
void foo(T* bar); // Note: takes ownership of 'bar'.
auto tempT = std::make_unique<T>();
foo(tempT.release());
- 是否更安全?
- 它确实增加了关于所有权转移的更多清晰度,尽管从参数列表中调用“新”本身就已经非常清楚了。
请注意,很遗憾我无法更改 'foo' 的签名。
【问题讨论】:
-
当前示例中的异常安全级别相同。
-
您的想法缩小了可能发生坏事的窗口,并且可以通过
unique_ptr来避免,但这个窗口很小,所以我认为这还不够改进。 -
如果我要重构它,我会创建一个包装函数,它接受
std::unique_ptr,然后将其释放到foo。这使您可以拥有像auto ptr = std::make_unique<some_type>(args); ...; wrapper(std::move(ptr));这样的呼叫站点。
标签: c++ exception unique-ptr