14

を使用して一時的な自動削除文字バッファを宣言した場合

std::auto_ptr<char> buffer(new char[n]);

バッファが範囲外になると、バッファは自動的に削除されます。delete を使用してバッファを削除すると仮定します。

ただし、バッファーは new[] を使用して作成されているため、厳密に言えば、バッファーは delete[] を使用して削除する必要があります。

この不一致が原因でメモリ リークが発生する可能性はありますか?

4

8 に答える 8

19

new[]で割り当てられたポインタでdeleteを呼び出す動作は未定義です。ご想像のとおり、auto_ptrは、スマートポインターがスコープ外になると、deleteを呼び出します。心配しなければならないのはメモリリークだけではありません。クラッシュやその他の奇妙な動作が発生する可能性があります。

ポインタの所有権を譲渡する必要がない場合は、Boostのscoped_arrayクラスが探している可能性があります。

于 2008-11-04T09:40:45.683 に答える
10

char のベクトルをバッファーとして使用します。

std::vector<char>    buffer(size);

read(input,&buffer[0],size);

基本的に、必要がなければ new を呼び出す必要さえありません。
ベクターは、配列 (バッファー) のように使用できるランタイム サイズのバッファーを提供します。

最良の部分は、ベクトルがそれ自体の後にクリーンアップされ、標準により、ベクトル内のすべての要素が連続したストレージにあることが保証されることです。バッファーに最適です。

または、より正式な保証は次のとおりです。

(&buffer[0]) + size == (&buffer[size])
于 2008-11-04T18:12:11.190 に答える
7

これにより、未定義の動作が発生します(たとえば、ヒープの破損など、メモリリークよりも悪い場合があります)。代わりに、boostのscoped_arrayまたはshared_arrayを試してください。

于 2008-11-04T09:41:09.193 に答える
6

new[]で割り当てられたデータに対するdeleteの呼び出しは未定義です。これは、コンパイラが何でもできるコードを生成する可能性があることを意味します。ただし、この場合は、配列内の個々の文字を破棄する必要はなく、配列自体を破棄する必要があるため、おそらく機能します。

それでも、この動作は定義されていないため、代わりにstd::vector<char>またはを使用することを強くお勧めします。boost::scoped_array<char> / boost::shared_array<char>すべてが完全に実行可能でありstd::auto_ptr<>、この場合に使用するよりも優れたオプションです。使用する場合std::vectorは、必要に応じてバッファを動的に拡張することもできます。

于 2008-11-04T09:42:30.033 に答える
5

std::string を使用しない正当な理由はありますか? std::vector、他の人が示唆しているように? あなたがしていることは間違っていますが、何をしようとしているのかを知らなければ、他の何かを勧めることは困難です。

于 2008-11-04T18:20:17.477 に答える
4

はい、違います。簡易包装紙で包みます。

typedef< typename T_ >
struct auto_vec{
  T_* t_;
  auto_vec( T_* t ): t_( t ) {}
  ~auto_vec() { delete[] t_; }
  T_* get() const { return t_; }
  T_* operator->() const { return get(); }
  T_& operator*() const { return *get(); }
  /* you should also define operator=, reset and release, if you plan to use them */
}

auto_vec<char> buffer( new char[n] );
于 2008-11-10T20:20:09.603 に答える
2

質問されてから数年が経ちました。

しかし、私は検索からこのページにたどり着いたので、注意したほうがよいと思いました: auto_ptr の C++11 代替であるstd::unique_ptrは、new[] で作成されたオブジェクトの削除を処理できます。

std::unique_ptr には 2 つのバージョンがあります: 1) 1 つのオブジェクトの有効期間を管理します (例: new で割り当て) 2) オブジェクトの動的に割り当てられた配列の有効期間を管理します (例: new[] で割り当て)

cppreference unique_ptr

于 2012-07-17T00:33:39.107 に答える
0

これは、非常に単純なソリューションとしては非常に複雑に思えます。使って何が悪い

 char *c=new char[n] 

ここで削除しますか?または、もう少し動的なソリューションが必要な場合は、

vector<char> c

オッカムの剃刀だ。:-)

于 2008-11-04T18:52:46.600 に答える