我在删除模板时遇到问题 我的模板和析构函数:
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.;
}
我的堆和析构函数:
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);
}
这是保存模板的对象,我也遇到了问题:
class Garage
{
private :
Consortium<string, Vehicle*> m_consortium;
public :
~Garage() {delete &m_consortium;}
};
这里有什么问题?
答案 0 :(得分:2)
这是错误的:
delete &m_consortiumHeap;
您必须delete
仅使用new
分配的内容m_consortiumHeap
。 delete
是类的一部分,在类被分配时自动分配,并在类被释放时自动释放。您不能也不能明确m_consortiumMap.clear();
它。
这可能有相反的问题:
m_consortiumMap
Consortium
的内容是指针。我无法从您显示的代码中看出来,但如果地图中的节点是由new
类使用delete
分配的,则必须delete
编辑,否则您将泄漏记忆。清除地图只会消除指针,它不会释放它们指向的内存。您必须首先遍历地图并for (int i = 0 ; i < m_heapVector.size() ; i++)
m_heapVector.erase(m_heapVector.begin() + i);
每个元素。虽然元素的重新分配很重要,但是在析构函数中清除地图是没有意义的,因为无论如何地图本身都会立即被销毁。
这只是令人困惑:
m_consortiumMap
首先,我所说的关于m_heapVector
的所有内容也适用于new
:如果内容是Heap
类的delete
,则必须{{1}它们在析构函数中。从向量中删除指针是没有意义的,更不用说上面的循环中有一个逻辑错误。迭代容器时,应该使用迭代器本身,例如
for (std::vector<Node<T>*>::iterator i = m_heapVector.begin() ; i != m_heapVector.end() ; i++)
此外,std::vector
与std::map
一样,具有clear()
函数,但就像我说清除析构函数中的向量一样毫无意义。你真正想要做的是释放元素(如果需要)。
答案 1 :(得分:2)
如果您没有使用new
创建对象,则无法使用delete
来删除它。
答案 2 :(得分:1)
您可能希望删除向量中元素指向的对象。擦除方法不会这样做,它只是从向量中删除指针元素,而不会破坏指向的对象。所以你需要(我推测)首先删除指向的对象,以避免内存泄漏。你这么冷:
for( vector<Node<T>*>::iterator iter = m_heapVector.begin(), endI = m_heapVector.end(); iter != endI; ++iter)
{
delete *iter;
}
// m_heapVector.clean(); // Not necessary in destructor, since the vector will be destroyed anyway.
使用C ++ 0x函数:
std::for_each( m_heapVector.begin(), m_heapVector.end(), []( Node<T>* node) { delete node; });
此外,使用容器的clear()
方法(在您的情况下为vector)来删除所有元素。
答案 3 :(得分:0)
由于m_consortiumHeap是您的类的数据成员(直接,而不是指向它的指针),因此您不必显式删除它。当Consortium实例被破坏时,它会自动为你调用m_consortiumHeap的析构函数。