我希望避免在需要读取命令行参数的程序中出现任何内存泄漏,该参数是要读取的参数文件的路径。如果我编译以下程序并用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;
严格来说,这是泄漏:
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);
}
可能足以触发工具警告。
可能丢失意味着您的程序正在泄漏内存,除非您使用指针做异常的事情,这些指针可能导致它们指向已分配块的中间。但是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;
}