new T(...) 与 std::make_unique<T>(...).release()

P-G*_*-Gn 5 c++ constructor unique-ptr

我正在查看CppCon 2014 的“Hourglass API”演讲配套代码,该代码主要通过使用具有 C 签名的函数包装类的成员函数来向 C++ 库提供 C API。

除此之外,我对这个物体的构造方式很感兴趣。hairpoll_construct在构造新对象的函数中hairpoll,指针通过以下方式获得

std::make_unique<hairpoll>(person).release()
Run Code Online (Sandbox Code Playgroud)

它实际上是在处理异常的函数中调用的。一种更简单的方法是诉诸简单的方法

new hairpoll(person)
Run Code Online (Sandbox Code Playgroud)

在什么情况下前者更可取?这是否与这个特殊 API 的工作方式有关,或者比这更通用?

Che*_*Alf 3

如果构造函数抛出异常,则new表达式 \xc2\xb9 在传递异常之前自动释放内存。

\n\n

作者可能认为需要使用临时unique_ptr来实现这一点。

\n\n

我不知道有什么优势。

\n\n

\n \xc2\xb9 除非该类定义了分配器函数,否则operator new,没有相应的解除分配器函数,operator delete。Microsoft 的 MFC 类库中的调试功能曾经属于这种情况。内存泄漏,但仅限于调试版本。\n

\n