私はこのメッセージを受け取りました:
expected 'void **' but argument is of type 'char **'
これに似たものをコンパイルしようとしたとき:
void myfree( void **v )
{
if( !v || !*v )
return;
free( *v );
*v = NULL;
return;
}
スタックオーバーフローに関するこの質問を読んだ後、解決策だと思うものを見つけました:
二重間接参照を扱うときの互換性のないポインター警告を回避する - スタックオーバーフロー
だから私はこのようなものに調整しました:
#include <stdio.h>
#include <stdlib.h>
void myfree( void *x )
{
void **v = x;
if( !v || !*v )
return;
free( *v );
*v = NULL;
return;
}
int main( int argc, char *argv[] )
{
char *test;
if( ( test = malloc( 1 ) ) )
{
printf( "before: %p\n", test );
myfree( &test );
printf( "after: %p\n", test );
}
return 0;
}
これは合法的な C ですか? 私は void ポインターを逆参照していますね。
みんなありがとう
2010 年 12 月 10 日 4:45PM EST 編集:
指摘されているようfree(NULL)
に安全であり、C 標準でカバーされています。また、以下で説明するように、上記の私の例は合法的な C ではありません。caf の回答、Zack の回答、および私自身の回答を参照してください。
したがって、malloc されるポインターを NULL として初期化してから、コード内で free() と NULL を直接出力する方が簡単です。
free( pointer );
pointer = NULL;
私が行ったように myfree() で NULL をチェックしていた理由は、fclose() の経験によるものでした。fclose(NULL)
プラットフォームによってはセグメンテーション違反が発生する可能性があるため (例: xpsp3 msvcrt.dll 7.0.2600.5512)、同じことが free() でも発生する可能性があると (誤って) 想定していました。関数でより適切に実装できるifステートメントでコードを乱雑にするのではなく、考えました。
皆様、良い議論をありがとうございました