推栈功能收到我找不到的内存泄漏

时间:2018-11-25 14:30:34

标签: c linked-list stack

我有一个函数可以对队列和堆栈执行不同的操作,例如推送,窥视,弹出,打印,初始化等。我已经完成了大多数操作,但是,内存泄漏以及pop_stack函数的分段错误,我不确定为什么。

我的pop_stack函数代码如下:

/* add entry to end of stack *stack */
/* allocate storage of data_size bytes in new entry */
/* copy data referenced by *data to entry */
/* return pointer to newly created entry */
/* print an error message and return if stack is NULL or empty */
/* or if data is NULL */
Node *push_stack(Stack *stack, void *data, size_t data_size)
{
    Node *new_node;
    Node *node;
    void *new_data;
    if (stack == NULL || data == NULL || stack->head == NULL)
    {
        fprintf(stderr, "warning: unable to push stack.\n");
        return NULL;
    }

    new_node = initialise_node();
    new_data = (void *)malloc(data_size);
    memcpy(new_data, data, data_size);
    new_node->data = new_data;
    return 0;

    if (stack->tail == NULL)
    {
        stack->head = new_node;
        stack->tail = new_node;
        new_node->data = new_data;
        return new_node;
    }
    else
    {
        node = stack->tail;
        stack->tail = new_node;
        new_node->prev = node;
        new_node->next = NULL;
        new_node->data = new_data;
    }
}

其余的堆栈代码在这里:     https://pastebin.com/zAFGdAbJ

Valgrind的整个输出在这里:     https://pastebin.com/25LTHnMk

我的pop_stack函数中没有任何free(),这是因为我有另一个文件对此进行了所有测试,在此任务中,不是所有的空闲都由程序来完成,而是由用户自己决定,因此由测试程序决定,而不是由功能内部完成。我所拥有的文件的主要功能在这里:https://pastebin.com/iZmn6nGd

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

好像您的return 0放在错误的位置。您无条件返回0(即NULL),因此指针new_node随调用堆栈被拆除,从而导致内存泄漏。