0

我无法删除我的模板。
我的模板和析构函数:

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;}
};

这里有什么问题?

4

4 回答 4

2

这从表面上看是错误的:

delete &m_consortiumHeap;

你必须只delete分配你分配的东西newm_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分配的,则必须将它们放在析构函数中。并且从向量中擦除指针是没有意义的,更不用说上面的循环有逻辑错误了。当你迭代一个容器时,你应该使用迭代器本身,例如newHeapdelete

for (std::vector<Node<T>*>::iterator i = m_heapVector.begin() ; i != m_heapVector.end() ; i++)

此外,std::vector, likestd::map有一个clear()功能,但就像我说的那样,清除析构函数中的向量是没有意义的。您真正想要做的是释放元素(如有必要)。

于 2010-09-23T13:37:06.530 回答
2

如果你不使用new创建一个对象,你就不能使用delete它来摆脱它。

于 2010-09-23T13:37:17.883 回答
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()容器的方法(在您的情况下为矢量)删除所有元素。

于 2010-09-23T13:31:48.117 回答
0

由于 m_consortiumHeap 是您的类的数据成员(直接,而不是指向它的指针),您不必显式删除它。当 Consortium 实例被析构时,它会自动为你调用 m_consortiumHeap 的析构函数。

于 2010-09-23T13:32:07.303 回答