Насколько свободен realloc, когда он копирует мои данные в память? - PullRequest
1 голос
/ 30 марта 2011

В приведенном ниже примере кода realloc освобождает память, выделенную для моих 10 строк "1234567890", когда он перемещает мой p1, или у меня есть утечка?

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

int main ( int argc, char *argv[] )
{
    char **p1 = NULL;
    char *p2 = NULL;
    int i;

    p1 = (char **) malloc ( 100 );

    for ( i = 0; i < 10; i ++ )
    {
        p1[i] =  (char *) malloc(10);
        memcpy ( p1[i], "1234567890", 10 );
    }

    p2 = malloc ( 100 );

    p1 = (char **) realloc ( p1, (1000 * sizeof(**p1)));

    for ( i = 0; i < 10; i ++ )
    {
        fprintf ( stdout, "p1: %s\n", p1[i] );
    }

    free(p1);
    free(p2);

    return 0;
}

1 Ответ

4 голосов
/ 30 марта 2011

realloc идет только на один уровень глубиной. Он даже не знает, что вы передаете ему указатель на указатель, поскольку его аргумент преобразуется в void*, его тип параметра. Что касается malloc, realloc и free, память - это просто массив байтов. Если вы храните указатели в памяти, это ваш выбор, но malloc не волнует.

Тем не менее, утечка памяти не происходит до free(p1), которая также не попадает в массив указателей. (realloc все равно будет копировать указатели, хранящиеся в буфере, если блок будет увеличен. Когда он уменьшен, у вас проблемы.)

Кроме того, поведение вашей программы не определено, поскольку вы не проверяете ошибки, а следующее работает только тогда, когда sizeof(char *) < 10:

p1 = (char **) malloc ( 100 );

for ( i = 0; i < 10; i ++ )
{
    p1[i] =  (char *) malloc(10);
    memcpy ( p1[i], "1234567890", 10 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...