LINUX.ORG.RU

[C++] Освобождение памяти

 


0

0

Если создать объект list<int> и записать в него много элеметнов — программа занимает заметно больше ОЗУ. Но если объект удалить — память как будто не освобождается. Как так?

Программа:

#include <stdio.h> 
#include <list> 

using namespace std;

int main(void) {

  printf("Старт. Пока ничего не сделано. Нажмите ввод...\n");
  getchar();

  list<int> * pl = new list<int>;

  printf("Заполнение списка...\n");

  for(int i=1; i<=2000000; i++) {
    (*pl).push_back(i);
  }

  printf("Список заполнен. Нажмите ввод...\n");
  getchar();

  delete pl;

  printf("Список удалён. Нажмите ввод...\n");
  getchar();

  return 0;

} // end func main;

Запуск:

g++ ./mem.cpp && a.out

Память смотрю программой htop. До заполнения списка:

 VIRT   RES   SHR 
 2672   660   572 

С заполненным списком:

 VIRT   RES   SHR 
33956 31976   628 

После удаления списка:

 VIRT   RES   SHR 
33956 31976   628 

Ответ на: комментарий от tailgunner

Да, если заполнение—удаление запустить в цикле, то занятая память не растёт до бесконечности. Со второго оборота число будет постоянным.

А как можно отдать память системе? Память может оказаться гораздо нужнее другим программам.

sergey_feo
() автор топика
Ответ на: комментарий от sergey_feo

> Память может оказаться гораздо нужнее другим программам.

оставь лучше это на усмотрение ОС - если конечно не работаешь с сотнями и больше Мб

П.С. вроде munmap для этого используется( сам не пробовал )

lester ★★★★
()
Ответ на: комментарий от lester

> оставь лучше это на усмотрение ОС
Она сама заберёт память, если ей понадобится?
Если так, то мне не стоит беспокоиться :-)

> если конечно не работаешь с сотнями и больше Мб

Пока не работаю, вопрос чисто теоретический :-)

> вроде munmap для этого используется

Насколько я понял, проглядев по диагонали man munmap, эта функция рассчитана на использование в паре с mmap.

sergey_feo
() автор топика
Ответ на: комментарий от zh

>> А как можно отдать память системе?
>закрыть программу!!1 =)


Вот я и смотрю: просто закрытие всех вкладок в Опере и закрытие—открытие Оперы дают разное высвобождение памяти. Нехорошо это.

sergey_feo
() автор топика
Ответ на: комментарий от sergey_feo

> Она сама заберёт память, если ей понадобится?

да, а изменённые страницы вытеснит в свап.

sergey_feo, если так хотите, добавьте после delete pl; malloc_trim(0); только это сделает Вашу программу не переносимой.

Eshkin_kot ★★
()
Ответ на: комментарий от l5k

Тем, что для данной задачи объем занятой памяти до заполнения и после освобождения будет одинаковым. Попробуйте и удивитесь, особенность аллокатора C++.

faber
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.