Я чтение 400mb
файла в C вектор ++ со следующим кодом:C++ утечка памяти с STD :: векторами
#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, это показывает мне, что баран занят processFrequencyData.exe!std::_Container_proxy
. «Выделение стека вызовов» выглядит так:
Это, как представляется, имеют свои корни в векторе.
Как я могу остановить использование барана от увеличения?
Спасибо.
Update:
Мой использование баран по-прежнему быстро растет, когда я закомментируйте строки кода в то время цикла, который присваивает значения
while (fIn >> dName >> dUssage) {
//primDataBank[counter].name = dName;
//primDataBank[counter].ussage = dUssage;
counter++;
}
Однако таран использование не увеличивается, когда я код комментария:
//std::vector<worddata> primDataBank;
//primDataBank.resize(RAMALLOC);
Можете ли вы дать нам [mcve]? – jaggedSpire
Вы можете сделать паузу в своей программе сразу после изменения размера вектора? Когда вы нажмете паузу, вы увидите, что память больше не выделена. –
* Я разместил вектор размером до 20 000 000 элементов, так как я назначаю его в цикле, использование плунжера не должно увеличиваться. * Ну ... да, должно. Вначале ваш вектор содержит * пустые строки *, которые вы заполняете при выполнении цикла, те же берут память. – Borgleader