0

プログラミングでは、Kernighan&Ritchieによって導入された一般的なルールがあり、「malloc」によって割り当てられたすべてのスペースに対して「無料」と呼んでいます。

したがって、次のコードは正しいです。

- (UIImage*) convertImage:(UIImage*)sourceImage {
   unsigned char *rawData = malloc(requiredSpace);
   ...
   ...
   free(rawData);
   return imageRef;
}

ただし、関数内にはカプセル化もあります。そのため、関数から戻った後、メモリは自動的に解放されます。したがって、理論的には、上記の例では無料は絶対に必要ではありません。これは正しいです?

4

1 に答える 1

4

絶対にありません。

free静的に割り当てられた変数に対してのみメモリが解放されるため、これが必要です。malloc(およびcallocまたは)を使用するreallocと、明示的にを呼び出さない限り解放されないメモリが動的に割り当てられますfree

例えば:

-(void)method {

    char a[10];
    char *b = (char*) malloc(10*sizeof(char));

}

aスコープの最後で破棄され(少なくとも、そのコンテンツに依存できないように、空きメモリとしてマークされます)、bプログラムが終了するまでメモリに残ります。そのメモリアドレスへのポインタを失うと(おそらく、別の値を割り当てbたり、関数を返さずに関数を終了したりするとb)、メモリを解放できなくなり、メモリリークが発生します。

于 2012-06-10T10:52:27.477 に答える