0

假设我有一个双向链表,例如

class list
{
    /*...*/

private:
    struct node
    {
       node* prev;
       node* next;
       int* value;
    }

    node* first; //NULL if none
    node* last; //NULL if none

    /*...*/
}

如果我想编写一个删除第一个节点并返回指向其值的指针的函数,这个实现会泄漏内存吗?

int* returnFrontValue()
{
   if(list_is_Empty())
        throw -1;
   else
   {
        node* v = first;
        int* returnMe = v->value;

        first = first->next;
        if(!first)
            last = NULL;

        delete v;
        first->prev = NULL;

        return returnMe;
   }
}

我很好奇这个实现是否会泄漏内存,因为returnMe它指向一个动态分配的 int。int returnMe = *(v->value);最后有一个和返回会更好&returnMe;吗?

我必须delete v->value;在我之前明确delete v;吗?当您有各种指针时,我对删除内存的工作方式感到困惑。

4

1 回答 1

2

我们看不到它int是如何分配的,但我相信它是动态分配的(作为与节点分开的分配,您将其删除)。

在那种情况下不,你还没有泄露任何东西,你正在诱惑命运。这不是泄漏,因为指向的指针int仍然存在,所以它仍然可以被删除。但现在责任在于调用者。如果我调用returnFrontCaller,我会得到一个指向值的指针,然后当我完成它时我必须调用delete它。

这不是很直观。一般new/delete调用应该在同一个地方匹配。如果我打电话new,我也会打电话delete。如果new电话发生在其他地方,我不认为电话delete是我的责任。

但是为什么值是动态分配的Why do you store anint* instead of anint` 呢?为什么函数返回一个指向 int 的指针,而不是它的副本?

如果您进行了更改,则不需要内存管理。调用者会得到一个 int,而不必担心“谁来电delete”。

或者,您可以使用智能指针类来包装它,并处理内存管理。

于 2012-12-09T10:44:03.887 回答