auto_ptrを使用して動的に割り当てられた配列へのポインターを保持する場合、auto_ptrが強制終了されると、 delete []ではなく単純な削除操作が使用されるため、割り当てられた配列は削除されません。
動的に割り当てられたアレイでauto_ptrを(適切に)使用するにはどうすればよいですか?
これが不可能な場合、動的に割り当てられた配列に代わる別のスマートポインターはありますか?
前もって感謝します。
あなたはそうしない。std::auto_ptr
アレイで使用するためのものではありません。
new[]
およびの使用は避けてくださいdelete[]
。std::vector
代わりに 使用してください。これもStroustrupの推奨事項です。
ポインタを期待するコードに配列を渡す必要があるために配列を使用している場合は、代わりに(空でない)ベクトルの最初の要素のアドレスを渡すことができます。例えば:
std::vector<char> buf(size);
fgets(&buf[0], buf.size(), stdin);
C ++ 11では、 ;buf.data()
の代わりに使用できます(使用する必要があります) 。空のベクトルでも機能します。&buf[0]
buf.data()
boost::shared_arrayはあなたが探しているものです。
編集:
ブーストの使用を避けたい場合は、std::vector
それらをアレイの下に配置するだけで使用することをお勧めします。メモリ割り当てについて心配する必要はありません。shared_array
実際、これはとにかくより良い解決策です。
使用したいことを示しているauto_ptr
ので、の参照カウントと所有権モデルは必要ありませんshared_array
。したがって、動的に割り当てられた配列を置き換えるように調整されているstd :: vectorを使用します。これは、実際にはを使用して管理しようとしているものですauto_ptr
。
自分で実行したい場合(つまり、ブーストを使用しない場合)は、最初に動的配列をクラスでラップします。クラスのデストラクタにを呼び出しますdelete[]
。次に、はクラスをauto_ptr<Wrapper>
呼び出すことができdelete
、メモリは適切に割り当て解除されます。
この場合の適切なブーストスマートポインターはboost::scoped_arrayであり、より有名なboost :: shared_arrayではありません。これstd::auto_ptr
は、が唯一の所有権ポインターであるためです。共有所有権ポインターの反対。C ++ 0xでは、正しいポインターはですstd::unique_ptr
。これは、配列を指している場合はdelete []を呼び出し、単一のオブジェクトを指している場合はdeleteを呼び出します。
auto_ptrを(動的に割り当てられた配列などで)使用する正しい方法は、代わりに他のものを使用することです。あなたの場合、TR1からboost::shared_arrayまたはおそらくshared_ptr>またはshared_ptr>のいずれか。一般的な場合、shared_ptrまたはunique_ptrは、実際にはスマートなスマートポインターです。auto_ptrの使用を停止します。