Как освободить нулевой указатель после использования malloc - PullRequest
1 голос
/ 24 апреля 2020

Например, у меня есть код ниже для расчета размера указателя (например, массив в этом случае):

#include <stdio.h>
#include <stdlib.h>

int **ptr;
void init() {
    ptr = malloc(sizeof(int *)*5);
    if(!ptr){
        printf("cannot malloc, \n");
        return;
    }
    for(int i =0; i < 5; i++) {
        ptr[i] = malloc(sizeof(int));
        if(!ptr[i]){
            printf("cannot malloc, ptr[%d]\n", i);
            return;
        }
    }
    ptr[4] = NULL;
}

int main(void) {
    init();
    int count = 0;
    while(ptr[count] != NULL) {
        count++;
    }
    printf("size of ptr = %d\n", count);
}

IDEA:

Добавить нулевой указатель на и массив в функции init(), затем используя while l oop, чтобы вычислить размер, увеличивая count, пока не встретится указатель NULL. Это плохая идея?

Вопрос;

Как я знаю, для free(pointer) функции, если pointer НЕДЕЙСТВИТЕЛЕН, ничего не происходит. Итак, Как освободить ptr[4]?

Я пытаюсь освободить этот указатель:

    for(int i =0; i < 5; i++) {
        free(ptr[i]);
    }
    free(ptr);

Затем подтвердите с помощью Valgrind

==2957== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==2957==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2957==    by 0x108775: init (test2.c:12)
==2957==    by 0x1087E1: main (test2.c:22)
==2957== 
==2957== LEAK SUMMARY:
==2957==    definitely lost: 4 bytes in 1 blocks
==2957==    indirectly lost: 0 bytes in 0 blocks
==2957==      possibly lost: 0 bytes in 0 blocks
==2957==    still reachable: 0 bytes in 0 blocks
==2957==         suppressed: 0 bytes in 0 blocks

Одна вещь, которую я могу попробовать, это использовать realloc (я знаю, что realloc(PTR, 0) не эквивалентно free(PTR)):

ptr[4] = realloc(ptr[4], 0);

Но все еще возникают утечки памяти при тестировании Valgrind.

1 Ответ

3 голосов
/ 24 апреля 2020

Вы используете c немного памяти, сохраните это значение в ptr[4], затем перезапишите ptr[4] с помощью NULL. Здесь происходит утечка памяти. Ничто из того, что вы делаете после этого, не сможет восстановить потерянную память.

Вы захотите остановить свой l oop на 4 (вместо 5).

...