[在C中使用calloc为char数组分配内存时,如何避免'可能丢失'的内存

问题描述 投票:2回答:2

我希望避免在需要读取命令行参数的程序中出现任何内存泄漏,该参数是要读取的参数文件的路径。如果我编译以下程序并用valgrind检查可执行文件,我仍然会返回“泄漏摘要”,该泄漏摘要“可能丢失:3个块中的72个字节”。在以下设置中如何避免内存泄漏?

非常感谢您的帮助!

// main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "constant.h"

void set_up_parameters( parameters *params, int argc, char **argv )
{
    char *input_file_name_ptr;
    input_file_name_ptr = calloc((INPUT_CHAR_LEN + 1), sizeof(char));
    if(input_file_name_ptr == NULL){
        printf("Cannot allocate input_file_name_ptr\n");
        exit(1);
    }
    params->input_file_name = input_file_name_ptr;
}


int main(int argc, char *argv[])
{
    parameters *params_ptr;
    params_ptr = NULL;
    params_ptr = calloc(1, sizeof(parameters));
    if(params_ptr == NULL){
        printf("Cannot allocate parameters\n");
        exit(1);
    }

    set_up_parameters( params_ptr, argc, argv);

    free(params_ptr->input_file_name);
    free(params_ptr);
    return 0;
}

我的文件constant.h如下:

#define INPUT_CHAR_LEN 100

typedef struct{
    char *input_file_name;
    int n_params;
} parameters;
c memory valgrind calloc
2个回答
0
投票

严格来说,这是泄漏:

if(input_file_name_ptr == NULL){
        printf("Cannot allocate input_file_name_ptr\n");
        exit(1);
}

应写为

if(input_file_name_ptr == NULL){
        free(params);
        printf("Cannot allocate input_file_name_ptr\n");
        exit(1);
}

可能足以触发工具警告。


0
投票

可能丢失意味着您的程序正在泄漏内存,除非您使用指针做异常的事情,这些指针可能导致它们指向已分配块的中间。但是valgrind无法判断这是编程错误还是您在巧妙地执行此操作。这就是为什么它警告您。beow代码将解决此问题:

/ main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "constant.h"

void set_up_parameters( parameters *params, int argc, char **argv )
{
    char *input_file_name_ptr;
    input_file_name_ptr = calloc((INPUT_CHAR_LEN + 1), sizeof(char));
    if(input_file_name_ptr == NULL){
        free(params);
        printf("Cannot allocate input_file_name_ptr\n");
        exit(1);
    }
    params->input_file_name = input_file_name_ptr;
}


int main(int argc, char *argv[])
{
    parameters *params_ptr;
    params_ptr = NULL;
    params_ptr = calloc(1, sizeof(parameters));
    if(params_ptr == NULL){
        printf("Cannot allocate parameters\n");
        exit(1);
    }

    set_up_parameters( params_ptr, argc, argv);

    free(params_ptr->input_file_name);
    free(params_ptr);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.