Рассмотрим следующий код, скомпилированный с g++ problem.cpp -o problem
:
#include <vector>
using namespace std;
int main()
{
while(1){}
return 0;
}
Когда этот код выполняется, команда top
сообщает, что используется ~ 80 КБ памяти.
Теперь рассмотрим этот код:
#include <vector>
using namespace std;
int main()
{
vector<int> testVec;
for(int i = 0;i<100000000;i++)testVec.push_back(i);
while(1){}
return 0;
}
Как и ожидалось, в верхнем отчете говорится, что используется около 300 МБ памяти.
Теперь, наконец, рассмотрим этот код:
#include <vector>
using namespace std;
int main()
{
vector<int> testVec;
for(int i = 0;i<100000000;i++)testVec.push_back(i);
testVec.clear();
vector<int>().swap(testVec);
while(1){}
return 0;
}
Теперь top
сообщает, что потребляется ~ 4196K (!) - почему не только ~ 80K, как в первом примере? Как я могу наконец освободить этот последний бит памяти, который предположительно используется вектором? Я читал, что в дополнение к .clear()
, «трюк со свопом» предназначен для освобождения всего, но, очевидно, он не работает так, как я ожидал. Чего мне не хватает?