私は次のコードで++ベクトルCへ400mb
ファイルを読んでいる:STDとC++のメモリリーク::ベクトル
#define RAMALLOC 20000000
struct worddata {
std::string name;
double ussage;
};
// ...
int counter = 0;
std::string dName;
double dUssage;
std::vector<worddata> primDataBank;
primDataBank.resize(RAMALLOC);
std::ifstream fIn(PATH + "output.dat");
while (fIn >> dName >> dUssage) {
primDataBank[counter].name = dName;
primDataBank[counter].ussage = dUssage;
counter++;
}
私が割り当てるように私は、20,000,000
アイテムのサイズにベクトルを居住していますそのループの中で、ラムの使用量は増えてはいけません。しかし、私はそれを実行すると、ラムの使用が急速に増加します。
Visual Studioデバッガのヒープスナップショットでは、RAMがprocessFrequencyData.exe!std::_Container_proxy
で占有されていることがわかります。 「アロケーションコールスタックは、」そうのようになります。これは、ベクターにそのルーツを持っているように見えます
。
どのようにしてRAM使用量が増えるのを防ぐことができますか?
ありがとうございました。
アップデート:私は値
while (fIn >> dName >> dUssage) {
//primDataBank[counter].name = dName;
//primDataBank[counter].ussage = dUssage;
counter++;
}
を割り当てるwhileループ内のコードの行をコメントアウトするとき
私のRAMの使用量は依然としてしかしときに私も使用量が増加しないラム急速に増加
//std::vector<worddata> primDataBank;
//primDataBank.resize(RAMALLOC);
[mcve]を教えてもらえますか? – jaggedSpire
ベクトルのサイズを変更した直後にプログラムで一時停止を発行できますか?一時停止を押すと、メモリはもう割り当てられていないはずです。 –
*私はベクトルを20,000,000アイテムのサイズにしていますので、ループでそれを割り当てると、ラムの使用量は増えないはずです。あなたのベクトルは、最初に*空の文字列*を含んでいます。 – Borgleader