首页 > 解决方案 > 当我初始化包含动态数组的结构时,如何避免 valgrind(或其他 memcheck 工具)误报?

问题描述

我想初始化一个包含动态数组的结构,我把所有这些东西都写在一个函数中。而且还有另外一个函数可以清理这个struct,理论上不会有内存泄漏。但是,当我使用 valgrind 运行程序时,它报告在 entry 或 init 函数时存在内存泄漏。

首先,我用 malloc 编写了这个 init 函数来为这个结构分配内存。它报告内存泄漏。

然后,我将 malloc 更改为 realloc(NULL, ...) 以避免这种误报,但我失败了。

我不知道 C 中实现此功能的标准方法是什么。

#include <stdlib.h>

typedef enum
{
    RUN_SUCCESS,
    /*Failure*/
    RUN_FAILURE
} RunStat;

typedef struct
{
    char *elements;
    size_t top;
    size_t size;
} Stack;

RunStat init_stack(Stack *stack)
{
    stack->elements = (char *)realloc(NULL, 100 * sizeof(char));
    stack->size = 100;
    stack->top = 0;
    return RUN_SUCCESS;
}

RunStat free_stack(Stack *stack)
{
    free(stack->elements);
    stack->elements = NULL;
    stack->size = 0;
    stack->top = 0;
    return RUN_SUCCESS;
}


int main ()
{
    Stack stack;
    init_stack(&stack);
    free_stack(&stack);
    return EXIT_SUCCESS;
}

这里的每个内存都在我的控制之下,我想让这个结构初始化而没有任何内存泄漏警告。我想知道这样做的标准方法。

标签: cmemory-leaksmalloc

解决方案


推荐阅读