2017-01-12 112 views
4

我看着CppCon 2014年,大约是提供了一个C API到C的"Hourglass API" talkcompanion code ++库主要是通过包含具有C签名的函数的类的成员函数。新T(...)主场迎战的std :: make_unique <T>(...)。释放()

除此之外,我一直对如何构造对象感兴趣。在功能hairpoll_construct该构造新的对象hairpoll,指针是由

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

这实际上是所谓的用于处理异常的函数内获得。一种更简单的方法是使用纯粹的方式

new hairpoll(person) 

什么情况下,前者是可取的?这是否与这个peticuliar API的工作方式有关?还是比这更一般?

+0

如果可能,可能不再使用'new'。 – Jarod42

回答

2

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

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

我不知道有任何优势。

¹除非类定义了一个分配器功能,operator new,没有相应的释放器功能,operator delete。一旦这是Microsoft的MFC类库中调试功能的情况。内存泄漏,但只在调试版本中。

+0

关于您的脚注,我不确定作者(S. Du Toit)是否因为'hairpoll_destruct'使用'delete'而避免使用'new',因此记住了这种情况。 – user1735003

+1

@ user1735003:那么,'unique_ptr'不会有任何帮助。除了构造函数的一个例外,'unique_ptr'中的指针成员甚至没有被赋值/初始化。异常会阻止那里发生的任何事情,并且'unique_ptr'没有完全构造,所以它的析构函数没有被调用,所以'unique_ptr'不会参与清理。 –

相关问题