2012-03-28 13 views
0

私はsome_type型のオブジェクトを作成し、このオブジェクトに割り当てられたメモリへのポインタを返す関数some_func_1を持っています。C++でスマートポインタを使用してメモリを割り当てる方法と有効な方法

このメモリは、特別なsome_func_2を使用して削除する必要があります。 boost::shared_ptr<some_type>を使用し、カスタム削除機能としてsome_func_2を指定することは可能ですが、私はスレッドが1つしかなく、割り当てられたメモリのユーザーが1人しかないので効果的な方法ではありません。

つまり、scoped_ptrのようなものが必要ですが、カスタム割り当て解除機能を定義する可能性があります。どのように最大の有効性でこれを行うには?

答えて

3

おそらくstd::unique_ptr(これはC++ 11で利用可能です)を探しています。

でも、効率の問題は何ですか?ポインターのインスタンスが1つしかないことがわかっているときに参照カウントポインターを使用したくないのですか?

もしそうなら、それについてはあまり心配しないでください。ここでの参照カウントは少し役に立たないように思われますが、パフォーマンス上の問題は発生しません。それが問題であることを確かめるためにコードをプロファイリングしましたか?

特に低いメモリ条件で実行したり、すべてのプロセッササイクルが重要なコンテキストで実行しない限り、私はその違いに気付くことさえ非常に疑います。

最初にというメンテナンス可能なコードを書いてください。パフォーマンスの問題が発生した場合は、プロファイルして最適化してください。それを逆にすることは時間の無駄です。

+0

はい私は余分な操作をしたくありません。この場合は参照カウントです。 whileループでこのコードを使用します。while(true){//オブジェクトにメモリを割り当て、使用します。} ' – akmal

+0

' BOOST_SCOPE_EXIT'はどうしますか? – akmal

+0

@akmal:shared_ptrの使用によるオーバーヘッドはごくわずかなので、メモリ割り当て自体にかかる時間と比較してパフォーマンスの問題を引き起こす可能性があることを真剣に疑っています。とにかく、実際の測定可能なパフォーマンスの問題に気づく前に、二度と推測せずに 'shared_ptr'に行ってください:) – ereOn

1

boost::scoped_ptrデザイナーは、オーバーヘッドを減らすためにカスタムデアロケータをサポートしたくありませんでした。 boost mailing groupを引用すると:

あなたはshared_ptrのスタイルランタイムカスタムデアロケータのサポートをしたい場合は、 を頭上だった(とされる)ので、これがサポートされていないのscoped_ptrため は受け入れられないと考えます。代わりにshared_ptrを使用してください。

C++では、std::unique_ptrはカスタムデアロケータを呼び出すことができます。 std::unique_ptrテンプレートの第2パラメータとして、関数オブジェクトまたは左辺値参照を関数または関数オブジェクトに渡す必要があります。

+0

便利なことがたくさんあるのでC++ 11に切り替えることをお勧めしますが、私はunique_ptrが 'boost :: interprocess'に存在することを発見しました:http://www.boost.org/doc/libs/1_48_0 /doc/html/boost/interprocess/unique_ptr.html –

0

もう一つの可能​​性は、some_type another_typeでカプセル化し、好きなスマートポインタを使用してanother_typeのデストラクタがsome_typeの割り当て解除を処理することです。

関連する問題