Будет ли это удалить указатели, содержащиеся в карте [...]?
Нет, с учетом кода, который вы предоставили, вы будете утечка каждого члена карты.
Как правило, для каждого new
должно быть соответствующее delete
. У вас есть delete
для карты, но нет элементов для внутри.
Наиболее правильное решение этой проблемы - не использовать динамическое распределение вообще. Просто хранить MyType
сек каталог, если это возможно:
map<string, MyType>
... и вместо динамического выделения самого map
, магазин, который автоматически:
map<string,MyType> my_map;
Если автоматический срок хранения не представляется возможным для некоторых разум, затем используйте интеллектуальный указатель для динамических распределений. Учитывая, C++, 11 Компилятор а, использовать unique_ptr
(или, реже, shared_ptr
или даже weak_ptr
) для элементов в map
: (. Учитывая компилятор C++ 03, используют их эквиваленты подпиточного)
map<string, unique_ptr<MyType>> my_map;
Затем, когда уничтожается my_map
, все элементы будут delete
d.
Baring все это, если вы находитесь в ситуации, когда ни один из вышеперечисленных не будет работать для вас (я бы высоко подозреваемого), то вам нужно будет перебирать карту ОТСИДЕТЬ:
struct deleter
{
template <typename T> operator() (const T& rhs) const
{
delete rhs.second;
}
};
for_each (my_map->begin(), my_map->end(), deleter());
В C++ 11, это может быть сделано лямбда, что-то вдоль линии:
for_each (my_map->begin(), my_map->end(), [](auto item) -> void
{
delete item.second;
});
Более поздние - контейнеры 'map' (и большинство (если не все?) В стандартной библиотеке) не были предназначены для удаления любого указателя, который он содержит при уничтожении. – Nbr44
Хорошо спасибо. Документация, которую я прочитал, была не совсем понятна. Он гласит: «Это эффективно уменьшает размер контейнера по количеству удаленных элементов, которые уничтожаются». – Max
Это распространенное недоразумение - сами _pointers_ действительно уничтожены, но это не изменяет состояние места памяти, на которое они указывают , – Nbr44