gpt4 book ai didi

c++ - 如何删除模板?

转载 作者:行者123 更新时间:2023-11-27 22:30:05 28 4
gpt4 key购买 nike

我在删除模板时遇到问题。
我的模板和析构函数:

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

这是怎么回事?

最佳答案

从表面上看这是错误的:

delete &m_consortiumHeap;

你只能删除你用new分配的东西。 m_consortiumHeap 是类的一部分,在类被分配时自动分配,在类被释放时自动释放。您不能也不得显式删除它。

这可能有相反的问题:

m_consortiumMap.clear();

m_consortiumMap 的内容是指针。我无法从您显示的代码中看出,但是如果 map 中的节点是由 Consortium 类使用 new 分配的,则它们必须是 delete ed,否则会泄漏内存。清除映射只会清除指针,不会释放它们指向的内存。您必须首先遍历 map 并删除每个元素。虽然重新分配元素很重要,但在析构函数中清除 map 有点毫无意义,因为 map 本身无论如何都会立即被销毁。

这真是令人费解:

for (int i = 0 ; i < m_heapVector.size() ; i++)
m_heapVector.erase(m_heapVector.begin() + i);

首先,我所说的关于 m_consortiumMap 的一切也适用于 m_heapVector:如果内容是由 new 分配的Heap类,你必须在析构函数中删除它们。从 vector 中删除指针是没有意义的,更不用说上面的循环有逻辑错误了。当你迭代一个容器时,你应该使用迭代器本身,例如

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

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

关于c++ - 如何删除模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3778818/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com