C言語関係掲示板

過去ログ

No.648 reallocの後にfreeは必要か

[戻る] [ホームページ]
No.7054

reallocの後にfreeは必要か
投稿者---あたる(2003/06/03 12:18:46)


mallocしたあとfreeで確保した領域を解放しますが、reallcも
必要なのでしょうか。

main()
{
    char **earea;
    int  i;

    earea = (char **)malloc(sizeof(char*) * 1024);

    for(i=0 ; i<1024 ; i++)
    {
        earea[i] = (char *)malloc(1024);
    }

    for(i=0  ; i<1024  ; i++) {
        free(earea[i]) ;
    }
    free(earea) ;
}


No.7057

Re:reallocの後にfreeは必要か
投稿者---YuO(2003/06/03 13:07:08)


>mallocしたあとfreeで確保した領域を解放しますが、reallcも
>必要なのでしょうか。

メモリリークが怖くないなら不要。
#これはmallocも一緒。

でもって,
realloc(ptr, 0);

free(ptr);
に等しいから,この場合は不要。
#realloc(0, size);はmalloc(size);に等しかったりします。


No.7074

Re:reallocの後にfreeは必要か
投稿者---あたる(2003/06/04 00:28:34)


これでよいのですか。
mallocとどうように個々にfreeを行うのですか。

main()
{
    char **earea=NULL;
    int  size = 1024;
    int  i;

    cnt=に値を代入する

    for(i=0; i<cnt; i++)
    {
        if (erase == NULL || cnt >= size)
        {
           erase = realloc(erase, (size *= 2) * sizeof(char *));
           if (erase == NULL)
           {
               printf("error 1\n");
           }
        }

        erase[i]に値を代入する

        if (erase[*cnt] == NULL)
        {
           printf("error 2\n");
        }
        cnt++;
   }

   for(i=0; i<cnt; i++)
   {
       printf("[%d]=[%s]\n",i,erase[i]):
   }

   for(i=0; i<cnt; i++)
   {
       free(erase[i]):
   }
   free(erase);


No.7093

Re:reallocの後にfreeは必要か
投稿者---YuO(2003/06/04 21:25:28)


>これでよいのですか。

よくないです。


>mallocとどうように個々にfreeを行うのですか。

free自体はmallocと同じです。


        if (erase == NULL || cnt >= size)
        {
           erase = realloc(erase, (size *= 2) * sizeof(char *));
           if (erase == NULL)
           {
               printf("error 1\n");
           }
        }

        erase[i]に値を代入する


この時点で,reallocに失敗した場合,
・realloc呼び出す前にeraseに入っていたポインタが失われる→リークする
・eraseは空ポインタだから,erase[i]のアクセスは未定義動作
の二点が大問題です。


No.7101

Re:reallocの後にfreeは必要か
投稿者---あたる(2003/06/04 23:09:08)


main()
{
    char **earea=NULL;
    int  size = 1024;
    int  i;

    cnt=に値を代入する

    i=0;
    for(; ;)
    {
        if (i<cnt)
        {
            break;
        }
        if (erase == NULL || i >= size)
        {
           erase = realloc(erase, (size *= 2) * sizeof(char *));
           if (erase == NULL)
           {
               printf("error 1\n");
               exit(1);
           }
        }

        erase[i] = reallocで確保された領域に値を設定

        if (erase[i] == NULL)
        {
           printf("error 2\n");
           exit(1);
        }
        i++;
   }

   for(i=0; i<cnt; i++)
   {
       printf("[%d]=[%s]\n",i,erase[i]):
   }

   for(i=0; i<cnt; i++)
   {
       free(erase[i]):
   }
   free(erase);
}


reallocは、新しく領域を確保したら、元の領域をfreeしますが、最終的は、
最後に確保された領域のfreeが必要になりますが、cntの処理回数により、
「size *= 2」 だけ確保しているので分が必要ということですか。
それとも、freeの1回でよいのですか。
ループで、個々にfreeしても、1回のfreeでもエラーにななりませんでした。


No.7105

Re:reallocの後にfreeは必要か
投稿者---YuO(2003/06/05 00:44:07)


>reallocは、新しく領域を確保したら、元の領域をfreeしますが、最終的は、
>最後に確保された領域のfreeが必要になりますが、cntの処理回数により、
>「size *= 2」 だけ確保しているので分が必要ということですか。
>それとも、freeの1回でよいのですか。
>ループで、個々にfreeしても、1回のfreeでもエラーにななりませんでした。

とりあえず,reallocというのは,malloc + memmove + freeです。
新たな領域を確保して,メモリを複写して,元の領域を開放します。
#新たな領域が不要なときは,なにもしないですが。

ちなみに,freeを一切しなくてもメモリが不足しなければエラーにはなりません。


No.7109

Re:reallocの後にfreeは必要か
投稿者---あたる(2003/06/05 01:55:30)


>ちなみに,freeを一切しなくてもメモリが不足しなければエラーにはなりません。

メモリが不足しなければ問題ないですが、確保したものは、解放
しなければいけないということでうね。

個々に1つづつとまとめてどちらが。