2017-01-12 10 views
4

Я смотрел companion code из "Hourglass API" talk из CppCon 2014, который посвящен предоставлению C API для библиотеки C++ главным образом путем обертывания функций-членов класса с функциями, которые имеют C-подпись.новый T (...) vs. std :: make_unique (...). Release()

Среди прочего, я был заинтригован тем, как объект построен. В функции hairpoll_construct, что создает новый объект hairpoll, указатель получается

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

, который на самом деле называется в функции, которая обрабатывает исключения. Более простой способ - обратиться к равнине

new hairpoll(person) 

Каковы сценарии, где предпочтительнее первое? Связано ли это с тем, как работает этот API peticuliar или является ли это более общим, чем это?

+0

Возможно, больше не использовать 'new', когда это возможно. – Jarod42

ответ

2

Если конструктор выбрасывает, выражение new ¹deallocates память автоматически перед передачей исключения.

Автор, возможно, подумал, что для этого необходимо использовать временный unique_ptr.

Я не знаю никаких преимуществ.

¹ Если класс не определяет функцию, в распределитель operator new, без соответствующей функции deallocator, operator delete. Как только это было в случае функциональности отладки в библиотеке классов MFC Microsoft. Память просочилась, но только в отладочных сборках.

+0

Что касается вашей сноски, я не уверен, что автор (S. Du Toit) имел в виду этот сценарий в своем избегании 'new', потому что' hairpoll_destruct' использует 'delete'. – user1735003

+1

@ user1735003: Ну, 'unique_ptr' не помог бы в любом случае. За исключением конструктора, элемент указателя в 'unique_ptr' даже не назначен/не инициализирован. Исключение останавливает все, что происходит там, и 'unique_ptr' не полностью сконструирован, поэтому его деструктор не вызывается, поэтому' unique_ptr' не будет участвовать в очистке. –

 Смежные вопросы

  • Нет связанных вопросов^_^