使用C ++链接列表模板类进行内存管理

时间:2012-01-22 22:12:32

标签: c++ linked-list

所以,我之前编写了一个链表类,但现在我需要编写一个Linked List Template类。没什么大不了的,但我一直遇到删除操作员的问题。 我尽可能多地重用了代码,但我无法弄清楚为什么删除节点的函数在两个程序中的行为都不一样。在我的模板类实现中,尝试使用delete释放内存时会出现运行时错误。

以下是相关代码:

所有节点都通过以下函数添加到main.cpp中:

template <class T>
void LinkedList<T>::insert(T data)
{
    if( pHead == NULL )
    {
        pHead = new LinkedList<T>( data );
    }
    else
    {
        LinkedList<T> *ptr = pHead;
        while( ptr->pNext != NULL )
        {
            ptr = ptr->pNext;
        }
        ptr->pNext = new LinkedList<T>( data );
    }
}

通过以下函数在main.cpp中删除所有节点:

template <class T>
void LinkedList<T>::removeFirst()
{
    if( !pHead ) return;
    else
    {
        LinkedList<T> *next = pHead;
        pHead = pHead->pNext;
        if( next != NULL)
        {
            delete next;
        }
    }
}

这是我的析构函数代码:

template <class T>
LinkedList<T>::~LinkedList()
{
    clear();
}

template <class T>
void LinkedList<T>::clear()
{
    LinkedList<T> *ptr = pHead;
    while( ptr )
    {
        LinkedList<T> *pTemp = ptr->pNext;
        delete ptr;
        ptr = pTemp;
    }
    pHead = NULL;
}

我在removeFirst函数尝试调用delete时出现访问冲突。 我觉得这个问题很简单,但几乎完全相同的代码在我的非模板实现中起作用,所以我想看看别人的想法,然后我把头撞到墙上太久了。

感谢。

2 个答案:

答案 0 :(得分:3)

您需要清楚地思考以下三个功能,并决定是仅删除一个项目,还是清除整个列表:

removeFirst
clear
~LinkedList

目前,所有这些功能都试图清除整个列表。发生崩溃是因为clear中的代码尝试多次删除相同的内容。

我很遗憾地说你的代码在很多方面存在严重缺陷。您可能需要以下内容:

~LinkedList() // delete *just this one node*, leaving the rest intact
clear()       // scan through the list. deleting each node (individually) in turn
removeFirst   // delete just one node.

每次拨打delete都会调用~LinkedList,目前正在尝试清除整个列表。

答案 1 :(得分:0)

这只是一个有根据的猜测,没有看到其余的代码,即构造函数或你对pHead的使用,除了第一个节点。

你正在调用下一个调用~RubdingList的delete,它将调用clear()。

Clear将使用你正在移除的节点的pHead,这没有任何意义,因为它不是第一个节点,我怀疑它没有被初始化。

KABOOM

我建议为实际的LinkedList创建一个单独的类,使用add / remove方法,以及列表中的节点(LinkedListNode?)只需要一个pNext指针。在不使用它的情况下在内容节点中使用pHead会在某种程度上混淆问题:)