2017-01-12 6 views
4

私は、CppCon 2014の"Hourglass API" talkcompanion codeを見ていました。これはC++ライブラリにC APIを提供することです主に、Cの署名を持つ関数を持つクラスのメンバ関数をラップすることによって行われます。新しいT(...)とstd :: make_uniqueの比較<T>(...)

とりわけ、私はオブジェクトがどのように構築されているかに興味を持っています。新しいhairpollオブジェクトを構築する機能hairpoll_constructでは、ポインタは実際に例外を処理関数内で呼び出され

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

することによって得られます。より単純な方法は、プレーンに頼ることです。

new hairpoll(person) 

前者が望ましいシナリオは何ですか?これは、この擬似APIがどのように機能するのか、これよりも一般的なのでしょうか?

+0

可能な場合は、もはや 'new'を使用しないことがあります。 – Jarod42

答えて

2

コンストラクタがスローした場合、newという式は、例外を渡す前に自動的にメモリを割り当てません。

これを達成するには、暫定unique_ptrを使用する必要があると考えていたのでしょう。

私は何の利点も知らない。

¹クラスは、対応するデアロケータ関数、operator deleteことなく、アロケータ機能、operator newを定義しない限り。これは、MicrosoftのMFCクラスライブラリのデバッグ機能の一例です。メモリがリークされましたが、デバッグビルドでのみ発生しました。

+0

あなたの脚注については、 'hairpoll_destruct'が' delete'を使うため、作者(S. Du Toit)が 'new'を避けるためにこのシナリオを念頭に置いているかどうかはわかりません。 – user1735003

+1

@ user1735003:「unique_ptr」はとにかく助けにならなかったでしょう。コンストラクタからの例外を除いて、 'unique_ptr'中のポインタメンバは割り当て/初期化されていません。例外はそこで起こっていることを止め、 'unique_ptr'は完全に構築されていないので、そのデストラクタは呼び出されないので、' unique_ptr'はクリーンアップに参加しません。 –

関連する問題