Это неправильно на его лице:
delete &m_consortiumHeap;
Вы должны только delete
вещи, которые вы выделили с new
.m_consortiumHeap
является частью класса и автоматически выделяется, когда класс выделяется, и автоматически освобождается, когда класс освобождается.Вы не можете и не должны явно delete
это.
Это может иметь противоположную проблему:
m_consortiumMap.clear();
содержимое m_consortiumMap
является указателями.Я не могу сказать из кода, который вы показали, но если узлы в карте выделены классом Consortium
с использованием new
, они должны быть delete
ed, иначе вы потеряете память.Очистка карты только избавит от указателей, она не освободит память, на которую они указывают.Сначала вы должны пройти по карте и delete
каждый элемент.Хотя освобождение элементов важно, очистка карты в деструкторе бессмысленна, поскольку сама карта все равно будет уничтожена сразу после этого.
Это просто сбивает с толку:
for (int i = 0 ; i < m_heapVector.size() ; i++)
m_heapVector.erase(m_heapVector.begin() + i);
firstвсе, что я сказал о m_consortiumMap
, относится и к m_heapVector
: если содержимое было выделено с new
классом Heap
, вы должны delete
их в деструкторе.Стирание указателей из вектора бессмысленно, не говоря уже о том, что в цикле выше есть логическая ошибка.Когда вы перебираете контейнер, вы должны использовать сами итераторы, например,
for (std::vector<Node<T>*>::iterator i = m_heapVector.begin() ; i != m_heapVector.end() ; i++)
Кроме того, std::vector
, как и std::map
, имеет функцию clear()
, но, как я сказал, очищать бессмысленновектор в деструкторе.Что вы действительно хотите сделать, так это освободить элементы (при необходимости).