如何释放C ++类中的静态指针指向的内存

时间:2018-10-10 06:27:44

标签: c++ pointers memory memory-leaks static

#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;
        }
    }
*/

但是程序无故终止。

1 个答案:

答案 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