Код ниже вызывает foo
и использует while(1)
для наблюдения за использованием памяти. Как я знаю, после печати "finished" var d
освобождается, и контейнер STL сам освобождает пространство данных (кучу).
#include <vector>
#include <string>
#include <iostream>
void foo() {
std::vector<std::string> d(100000000);
for(int i = 0; i < 100000000; ++i) d[i] = "1,1,3";
d.resize(0);
d.shrink_to_fit();
}
int main(int argc, char *argv[])
{
foo();
std::cout << "finished" << std::endl;
while(1) {;}
return 0;
}
Но что я заметил (используя htop
): память не освобождается обратно в операционную систему. Это просто стенд и реальный код, относящийся к MESOS
, который имеет ограничение памяти для каждого процесса.
Я пробовал несколько версий компилятора, таких как g++-4.7.2 g++-4.8.1, clang++ на сервере Linux с glibc 2.15. Более того, я также использую tcmalloc вместо malloc по умолчанию, но он все равно не работает (на машине MAC проблема не возникнет).
В чем проблема? Как я могу убедиться, что память возвращается ОС? Спасибо.
delete
просто должна освободить память, не указано, что она должна сразу вернуть ее в ОС. Если вы хотите гарантировать это, вам может потребоваться написать свои собственные версииnew
иdelete
, которые используют вызовы функций вашей ОС и обеспечивают фактическое возвращение памяти в ОС. - person IllusiveBrian   schedule 26.11.2014