Невозможно выяснить, что происходит неправильно.освобождение памяти для os после использования большого количества unique_ptr - C++
Вот простой код
size_t n_elem = 30000000; //careful! will allocate 1GB with unique_ptr
vector<unique_ptr<double> > tmp;
tmp.resize(n_elem);
for(size_t i=0; i<n_elem; i++){
tmp[i] = unique_ptr<double>(new double((double)i));
}
tmp.clear();
//Some answers in Stack overflow seems to suggest this technique to force
//freeing, but does not seem to work.
vector<unique_ptr<double> > tmp1;
tmp.swap(tmp1);
Когда заканчивается. Системный монитор по-прежнему показывает 948 МБ, как выделено, когда он должен показывать всплеск в использовании памяти, а затем освободить все правильно. Даже если фрагмент заключен в фигурные скобки {...}, чтобы обеспечить область видимости, я не вижу улучшения. Как только память будет выделена, она, похоже, не будет выпущена до конца программы.
Подозревая что-то с вектором, я пробовал приведенный ниже код, но с таким же поведением.
{
size_t n_elem = 30000000;
unique_ptr<double>* tmp = new unique_ptr<double>[n_elem];
for(size_t i=0; i<n_elem; i++)
tmp[i] = unique_ptr<double>(new double((double)i));
delete[] tmp;
}
Однако
size_t n_elem = 30000000;
double *d_tmp;
d_tmp = new double[n_elem];
for(size_t i=0; i<n_elem; i++)
{
d_tmp[i] = (double)i;
}
delete[] d_tmp;
Этот код показывает использование памяти растет около 260 МБ, а затем сокращается, как массив будет удален.
Я пробовал использовать класс вместо double и подсчитывал количество раз, когда деструктор вызывается со статической переменной. В обоих случаях деструктор называется правильным числом раз.
Я не могу понять, что не так в том, как я использую unique_ptr и почему он не возвращает память, выделенную ОС после уничтожения. Ссылка cpp, похоже, предполагает, что это должно произойти автоматически, поскольку uniue_ptrs уничтожаются. Как я могу сделать unique_ptr освобожденную память, которую он выделил, и вернуть ее в ОС?
Это произошло на gcc 4.6 с проектом ubuntu 12.04 и qtcreator qt.
Вы создаете два массива unique_ptr и только удаляете один? – yngccc
@yngum, Нет, проблема возникает даже во втором фрагменте кода. Фрагменты запускаются независимо. Первый фрагмент заменяет пустой вектор текущим вектором. – sri
второй фрагмент также создает два уникальных_ptr на каждый элемент – yngccc