8

私はstruct次のようなものを持っています:

struct queue_item_t {
    int id;
    int size;
    std::string content;
};

std::vector< queue_item_t >データベースクエリからこれらの多くが取り込まれた があります。

content各項目が処理されると、ファイルがディスクから読み取られ、その内容が文字列メンバーに入れられます。アイテムが処理され (content解析され)、.clear()すべてのメモリを消費しないように文字列に対して実行します。

ただし、これはメモリを解放していないようです。何十万ものアイテムを処理していますが、最終的にはメモリ使用量が利用可能な量を超えて上昇し、Linux によって「メモリ不足」が原因でアプリケーションが強制終了されます。

これらの文字列で使用されているメモリを解放するにはどうすればよいですか?

4

4 に答える 4

15

std::string と std::vector は、clear() でコンテナーの容量を変更しません (=> コンテナーのメモリを解放しません)。圧縮が必要なときはいつでも、一時オブジェクトを使用した以下のトリックを使用する必要があります (通常は必要ありません)。

my_queue_item.content.clear(); // clear
std::string(my_queue_item.content).swap(my_queue_item.content); // compact

クリーンアップと圧縮が必要な場合、上記のコードをより簡単にすることができます。

std::string().swap(my_queue_item.content);

一部の文字列の実装はコピー オン ライトです。このような文字列は、複数の場所から参照されると、書き込み時にメモリを再割り当てします。

于 2012-06-11T11:04:23.470 に答える
1

clear文字列のすべてのメモリを解放するわけではありません(おそらくバッファだけです)。文字列を空の文字列に設定するだけです。

文字列を呼び出すことができる場合はclear、代わりにそれを再利用してみませんか? したがって、新しい を作成する代わりに、queue_item_tその文字列メンバーを新しい値に置き換えるだけです。

于 2012-06-11T11:06:14.617 に答える
0

clearメモリを解放できない場合があります。文字列を論理的に空の文字列に設定しますが、既に割り当てられているメモリには影響しない場合があります。

同じ にさらにデータを読み込む場合はqueue_item_t、以前の文字列の内容を置き換える必要があります。

あなたはqueue_item_t自分自身を漏らしていませんか?

于 2012-06-11T11:09:53.053 に答える