функция free () не освобождает память кучи - PullRequest
0 голосов
/ 22 марта 2019

У меня есть 3 файла proj2.c, duplicate.h, duplicate.c proj2.c:

#include <stdio.h>
#include "duplicate.h"
#include<stdlib.h>
int main(int argc, char **argv)
{
    if (argc <= 1)
    {
        return 1;
    }

    char **copy = duplicate_args(argc, argv);
    char **p = copy;
    argv++;
    p++;

    while (*argv)
    {
        //printf("%s %s\n", argv[1], copy[1]);
        printf("%s %s\n", *argv++, *p++);
    }

    free_duplicated_args(copy);
    //free(copy);
    return 0;
}

duplicate.h:

char **duplicate_args(int argc, char **argv);

void free_duplicated_args(char **copy);

duplicate.c:

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
char **duplicate_args(int argc, char **argv)
{
        char **arrPointer=malloc((argc-1)*sizeof(char*));
        for(int i=1;i<argc;i++)
        {
                arrPointer[i] = (char*)malloc(strlen(argv[i])*sizeof(char));
                for(int j=0;j<strlen(argv[i]);j++)
                {
                        if(argv[i][j] > 64 && argv[i][j] < 91)
                        {
                                arrPointer[i][j]=argv[i][j]+32;
                        }
                        else if(argv[i][j] > 96 && argv[i][j] < 123)
                        {
                                arrPointer[i][j]=argv[i][j]-32;
                        }
                        else
                        {
                                arrPointer[i][j]=argv[i][j];
                        }
                }
//              arrPointer[i]=argv[i];

        }
        return arrPointer;
}

void free_duplicated_args(char **copy)
{
        free(copy);
}

Программа довольно проста. Принимает n аргументов и меняет заглавные буквы строк. Я создаю новый массив для хранения копии argv (используя malloc). Теперь, когда я запускаю valgrind: valgrind --leak-check = full ./proj2 1 Он говорит, что потерян 1 байт.

==10412== HEAP SUMMARY:
==10412==     in use at exit: 1 bytes in 1 blocks
==10412==   total heap usage: 3 allocs, 2 frees, 1,033 bytes allocated
==10412== 
==10412== 1 bytes in 1 blocks are definitely lost in loss record 1 of 1
==10412==    at 0x483577F: malloc (vg_replace_malloc.c:299)
==10412==    by 0x10927C: duplicate_args (in /root/Documents/OS/proj2/project/proj2)
==10412==    by 0x109194: main (in /root/Documents/OS/proj2/project/proj2)
==10412== 
==10412== LEAK SUMMARY:
==10412==    definitely lost: 1 bytes in 1 blocks
==10412==    indirectly lost: 0 bytes in 0 blocks
==10412==      possibly lost: 0 bytes in 0 blocks
==10412==    still reachable: 0 bytes in 0 blocks
==10412==         suppressed: 0 bytes in 0 blocks
==10412== 
==10412== For counts of detected and suppressed errors, rerun with: -v
==10412== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 0 from 0)

1 Ответ

3 голосов
/ 22 марта 2019

Ваш duplicate_args звонит malloc argc раз, в то время как free_duplicated_args звонит free только один раз, поэтому у вас утечка памяти.Должно быть

void free_duplicated_args(int argc, char **copy)
{
    for (int i = 1; i < argc; i++)
        free (copy [i]);

    free(copy);
}
...