Нужно ли удалять статическую карту std :: map? - PullRequest
3 голосов
/ 18 января 2011

В некоторых классах у меня есть статическая карта std :: map с указателями внутри. У меня вопрос, нужно ли мне удалять в конце программы или эта память автоматически освобождается. Меня беспокоит, если хранящиеся внутри указатели правильно удаляются через наши деструкторы при удалении std :: map.

Спасибо.

Ответы [ 7 ]

6 голосов
/ 18 января 2011

Если карта содержит указатели, которые были выделены с помощью new (или new [] или malloc ), тогда каждому указателю требуется соответствующий delete (или delete [] , или free ).

Деструктор карты не будет знать, что делать с лысым указателем.Попробуйте использовать умный указатель , который имеет соответствующую семантику перемещения, например умный указатель boost или, если у вас очень новый компилятор, один из умных указателей C ++ 0x.Однако не использует текущего стандарта std :: auto_ptr внутри контейнеров STL. Посмотрите эту ветку, чтобы узнать, почему .

Редактировать:

Как отметил Билли Онил, boost :: ptr_map также предназначен именно для этой цели.

2 голосов
/ 18 января 2011

Если я правильно понимаю ситуацию, вы не удаляете саму карту. Но вам, вероятно, нужно удалить объекты, на которые указывает карта. Вероятно, было бы действительно хорошей идеей использовать умный указатель, такой как Boost shared_ptr в вашей карте вместо собственных указателей. Затем объекты будут очищены автоматически.

Edit: Использование Boost ptr_map может быть даже лучшей идеей.

1 голос
/ 18 января 2011

std::map никогда не звонит delete своим участникам.Предполагая, что вы работаете с относительно новой операционной системой, ОС вернет память, занятую участниками при завершении процесса, но деструкторы не запустятся.

1 голос
/ 18 января 2011

Память «автоматически освобождается» в том смысле, что освобождается вся память процесса, но деструкторы объектов, на которые указывают, не будут вызываться. Это может вызвать утечку ресурсов, если вы используете RAII.

0 голосов
/ 18 января 2011

«Утечка» памяти - это случай, когда память непреднамеренно не удаляется в течение определенного периода времени и в конечном итоге уменьшается по мере продолжения процесса. Если это тип процесса, который выполняется в течение очень длительного периода времени, например, сервер, который редко перезапускается, это может быть серьезной проблемой.

Детекторы утечки памяти обнаружат любую память, которая выделена и не удалена программным вызовом, поэтому valgrind и т. Д. Сообщит об этом как об утечке.

Также полезно проверять ваш код с помощью таких программ, как valgrind, и, следовательно, чем меньше «мешает», тем легче будет обнаружить реальные утечки. Поэтому мой совет - не просто позволить системе очищать память или одиночные экраны и т. Д. Для вас, когда вы выделили указатель с новым (или malloc или new []).

Для этого можно выполнить процедуру «очистки». Просто поместите в область действия вашей карты объект, в котором есть удалитель (так как он будет удален при выходе), который очистит указатели на карте. Поскольку сначала необходимо удалить объект, он должен быть объявлен позже карты.

0 голосов
/ 18 января 2011

Как и в любом случае класса хранения, в котором хранятся указатели: вы обязаны освободить память, на которую они указывают.Класс хранения отвечает только за очистку собственных ресурсов.Полагаться на восстановление памяти ОС при завершении процесса - плохая практика.

0 голосов
/ 18 января 2011

Если у вас есть карта указателей, то ответ «нет», ваши деструкторы не будут вызываться, но «да», память будет освобождена в конце выполнения процесса. Вся память, выделенная процессом, всегда освобождается операционной системой при выходе из процесса (даже в случае сбоя), но деструкторы могут не вызываться.

...