【问题标题】:Pushing stack function receives memory leak which I cannot find [closed]推送堆栈函数收到我找不到的内存泄漏[关闭]
【发布时间】:2018-11-25 14:30:33
【问题描述】:

我有一个函数可以对队列和堆栈执行不同的操作,例如推送、查看、弹出、打印、初始化等。我已经完成了大部分操作,但是,我遇到了内存泄漏以及 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(),这是因为我有另一个文件对此进行了所有测试,并且在这个任务中,并非所有的 free() 都由程序完成,而是由用户自己完成,因此由测试程序完成,而不是全部在函数内完成。我得到的那个文件的主要功能在这里:https://pastebin.com/iZmn6nGd

谁能帮帮我?

【问题讨论】:

  • 您在pop_stack 函数中存在错误,但您显示的代码是针对push_stack
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已在 CC BY-SA 3.0 license 下授予 SE 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 SE 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work? ...

标签: c linked-list stack


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多