【问题标题】:new T(...) vs. std::make_unique<T>(...).release()new T(...) 与 std::make_unique<T>(...).release()
【发布时间】:2017-01-12 16:29:21
【问题描述】:

我在看 CppCon 2014 的 "Hourglass API" talkcompanion code,它主要通过使用具有 C 签名的函数包装类的成员函数来为 C++ 库提供 C API。

除其他外,我一直对对象的构造方式很感兴趣。在构造新的hairpoll对象的函数hairpoll_construct中,指针通过

std::make_unique<hairpoll>(person).release()

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

new hairpoll(person)

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

【问题讨论】:

  • 如果可能,可能不再使用new

标签: c++ constructor unique-ptr


【解决方案1】:

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

作者大概认为有必要使用一个临时的unique_ptr来实现这个。

我不知道有什么优势。

¹ 除非该类定义了分配器函数 operator new,但没有相应的释放器函数 operator delete。曾经,Microsoft 的 MFC 类库中的调试功能就是这种情况。内存泄漏,但仅限于调试版本。

【讨论】:

  • 关于您的脚注,我不确定作者 (S. Du Toit) 在避免使用 new 时是否考虑过这种情况,因为 hairpoll_destruct 使用 delete
  • @user1735003:好吧,unique_ptr 无论如何也帮不上忙。除了构造函数中的一个例外,unique_ptr 中的指针成员甚至没有被分配/初始化。异常停止了那里发生的一切,并且unique_ptr没有完全构造,所以它的析构函数没有被调用,所以unique_ptr不会参与清理。
猜你喜欢
  • 2017-04-20
  • 2019-05-27
  • 2016-01-23
  • 2014-04-29
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多