0

私は次のようにヒープ上にintのベクトルを作成しています:

std::vector<int> vec = *new std::vector<int>();

次に、プログラムの最後に到達し、メモリを解放する必要がありますが、を使用vec.clear()してもメモリは解放されません。

これを適切に行うにはどうすればよいですか?

ありがとう、そしてすべての最高-ミッチェル

4

2 に答える 2

4

これを正しく行うにはどうすればよいですか?

これを置き換えます:

std::vector<int> vec = *new std::vector<int>();

これとともに:

std::vector<int> vec;

問題が解決しました。

遭遇した可能性のある他の言語とは異なりnew、ほとんどの状況で避けるのが最善です。他の言語と同様に、オブジェクトを動的に割り当てます。ただし、他の言語とは異なり、C++ にはガベージ コレクターがないため、動的に割り当てたオブジェクトを手動で破棄する必要があります。しかし、あなたのコードの書き方では、それが不可能になっています。

オブジェクトへのポインターを返す new でオブジェクトを動的に割り当てています。次に、そのポインターを (* を介して) 逆参照し、オブジェクトを にコピーしますvecvec適切に破棄されますが、コピー元の動的に割り当てられたオブジェクトは破棄されません。そして、そのポインターを保存しなかったため、そのオブジェクトにアクセスする方法も、破棄する方法もありません。そのオブジェクトを破棄するには、次のようにポインターをキャプチャする必要がありました。

std::vector<int>* vec_pointer = new std::vector<int>();

その後、ポインターで delete を呼び出すことができます。これにより、オブジェクトが破棄され、メモリの割り当てが解除されます。

delete vec_pointer;

ありがたいことに、他の言語ではよくあることですが、動的割り当ては必要ありません。オブジェクトを宣言するとそれが作成され、スコープ外になると破棄されます。したがって、先ほど示した単純なコード行で十分であり、delete ステートメントは必要ありません。

補足として、何らかの理由で動的割り当てが必要であると判断した場合。スマートポインターを使用してください(グーグルで検索してください)。

于 2013-01-17T04:01:06.013 に答える
2

プログラムがメモリ リークを起こしています。

std::vector<int> vecスタック上でベクトルを宣言します。ヒープ上に 2 番目の (空の) ベクトルを作成し、それを使用してスタック上のベクトルをコピー構築します。空なので、これは事実上何もしません。

しかし、ヒープ上に作成されたベクトルへのポインターを失ってしまいました (それを保存したことがないため)。したがって、それを削除することはできず、そのメモリを再利用することはできません。ただし、スタック上のベクトルは、それ自体が問題なくクリーンアップされます。

おそらく必要なのは次のとおりです。

std::vector<int> vec;    // Vector on stack, no manual memory management required

なんらかの理由でどうしてもヒープを使いたい場合(スタックの方が高速で、ベクトルオブジェクト自体は要素数に関係なく小さい固定サイズなので、スタックオーバーフローを心配する必要はありません) 、 できるよ:

// Declare pointer to vector, and initialize it with a new vector on the heap
std::vector<int>* vec = new std::vector<int>();

または(C++ 11の場合):

auto vec = new std::vector<int>();

次に、作業が完了したら:

delete vec;
于 2013-01-17T04:03:28.420 に答える