2013-03-15 7 views
5

C++では、new/deleteではなく、常にunique_ptrまたはshared_ptrを使用する必要がありますか?どのようにパフォーマンスとは、スマートポインタははるかに遅いですか?C++ 11のスマートポインタは常に新しい/削除の代わりに?

+14

'unique_ptr'はゼロコストの抽象化として設計されました。心配するのをやめ、爆弾を愛することを学ぶ。 –

+9

** 'new'と' delete'の代わりに**スマートポインタ**を使う方法はありますか? – iammilind

+4

@iammilind 'make_shared'を削除するのを避けるために、**' new'でそれらを使用しなければなりません。また 'make_unique'の実装も使用します。もちろん、内部ではまだ 'new'を使います。 – Cubic

答えて

7

unique_ptr生ポインタを使用する場合と比べて実行時のオーバーヘッドがありません(想定されていません)。 shared_ptrにはメモリと時間のオーバーヘッドがあります(実装によってはいくらかが異なります)。実際にはshared_ptrのような振る舞いが必要な場合は、の実用的なのオーバーヘッドは簡単にゼロになります(つまり、他の実装ではより高速またはより効率的なメモリと考えることはできません)。

あなたのコードで新しい/削除を使用することは決してないとは言えませんが、それはあなたがいつもやることではありません。

2

私はそれはRAIICounted bodyイディオムを次の)

1 because-生のメモリを処理するためのshared_ptrを好むだろう。

2)オブジェクトは破棄されることが保証され、例外が発生してもメモリは解放されます。

3)新しい/削除するタイミングを決めることができなくなります。

+0

ポイント2は真ではありません。 1つのshared_ptrが何らかの方法で最初のものを参照するshared_ptrを含むオブジェクトを参照する場合。メモリリークが発生します。編集:スマートポインタの有無にかかわらず、あなたはまだ何かを知る必要があります。 – Tim

+0

ポイント2が真であり、循環参照は「有効な」状態である。 'shared_ptr'は、' ref_count == 0'が 'delete'を呼び出す場合にのみそれを与えます。 – Yankes

関連する問題