#pragma once // Link.h
#include <memory>
template <typename E>
class Link
{
private:
static Link<E> * freelist; // Pointer to the freelist head
// How to release the memory??
public:
E element;
Link *next;
Link(const E &eleval, Link *nextval = nullptr)
: element(eleval)
, next(nextval) {}
Link(Link *nextval = nullptr) : next(nextval) {}
/*~Link()
{
while (freelist->next != nullptr)
{
Link<E> *tmp = freelist;
freelist = freelist->next;
delete tmp;
}
}
*/
void *operator new(size_t)
{
if (freelist == nullptr) return ::new Link;
Link<E>* temp = freelist;
freelist = freelist->next;
return temp;
}
void operator delete(void* ptr)
{
((Link<E>*)ptr)->next = freelist;
freelist = (Link<E>*)ptr;
}
};
template <typename E>
Link<E>* Link<E>::freelist = nullptr;
在Link类中有一个静态指针,旨在将空闲列表存储在我的链接列表中,我想在程序结束后释放该空闲列表的内存。如何删除此空闲列表的内存。
PS:我试图这样释放内存:
/*~Link()
{
while (freelist->next != nullptr)
{
Link<E> *tmp = freelist;
freelist = freelist->next;
delete tmp;
}
}
*/
但是程序无故终止。
答案 0 :(得分:1)
但是程序无故终止。
让我们看一下该循环。在这里删除项目:
delete freelist;
然后,将其删除后,可以循环访问它:
while (freelist->next != nullptr)
这是未定义的行为。您正在访问已删除的元素。我建议改为进行递归,遍历列表并删除路径中的元素。也许像
/** Delete a link and all the ones after it as well */
void recursiveDelete()
{
if (next){
next->recursiveDelete();
}
delete this;
}
然后在freelist
上调用它。另外,您需要删除以下重载:
void operator delete(void* ptr)
{
((Link<E>*)ptr)->next = freelist;
freelist = (Link<E>*)ptr;
}
因此,如果我了解这项权利,则在删除Link
时,请设置链接的next
(无论如何都将被删除,所以什么也不做),然后设置{ {1}}到该链接将立即失效。这将导致删除项目。
正如Christophe指出的那样,删除这样的大列表可能会导致堆栈溢出。通过使用不使用递归的算法可以避免这种情况。您可以尝试这样的事情:
freelist