I’m having trouble with deleting my template.
My template and destructor:
template<class S, class T>
class Consortium
{
private :
map<const S, Node<T>*> m_consortiumMap;
Heap<T>m_consortiumHeap;
public :
~Consortium();
void Insert(const S key, T toAdd);
void Update(const S key);
void Remove(const S key);
const T Top();
};
template<class S, class T>
Consortium<S,T>::~Consortium()
{
m_consortiumMap.clear();
delete &m_consortiumHeap.;
}
My heap and destructor:
template <class T>
class Heap
{
private :
vector<Node<T>*> m_heapVector;
public :
~Heap();
int parent(int i) const {return i / 2;}
int left(int i) const {return 2 * i;}
int right(int i) const {return 2 * i + 1;}
void heapify(int index);
Node<T>* extractMin ();
void heapDecreaseKey (int index, Node<T>* key);
void MinHeapInsert (Node<T>* key);
Node<T>* ExtractNode(int index);
Node<T>* top ()const {return m_heapVector[0];}
};
template<class T>
Heap<T>::~Heap()
{
for (int i = 0 ; i < m_heapVector.size() ; i++)
m_heapVector.erase(m_heapVector.begin() + i);
}
and this is the object that holds the template, I’m having problems with that also:
class Garage
{
private :
Consortium<string, Vehicle*> m_consortium;
public :
~Garage() {delete &m_consortium;}
};
what’s wrong here?
This is wrong on its face:
You must only
deletethings that you allocated withnew.m_consortiumHeapis part of the class and gets automatically allocated when the class gets allocated and automatically deallocated when the class gets deallocated. You cannot and must not explicitlydeleteit.This may have the opposite problem:
the contents of
m_consortiumMapare pointers. I can’t tell from the code you’ve shown, but if the nodes within the map are allocated by theConsortiumclass usingnew, they must bedeleteed, otherwise you will leak memory. Clearing the map will only get rid of the pointers, it will not deallocate the memory that they point to. You must first iterate through the map anddeleteeach element. While deallocation of the elements is important, clearing the map in the destructor is kind of pointless since the map itself will be destroyed immediately afterwards anyway.This is just perplexing:
first of all, everything I said about
m_consortiumMapapplies also tom_heapVector: If the contents were allocated withnewby theHeapclass, you mustdeletethem in the destructor. And erasing the pointers from the vector is pointless, not to mention that the above loop has a logic error in it. When you iterate over a container, you should use the iterators themselves, e.g.Also,
std::vector, likestd::map, has aclear()function, but like I said it’s pointless to clear the vector in the destructor. What you really want to do is deallocate the elements (if necessary).