質問
これはcでやっても大丈夫でしょうか?
int *i;
// do stuff
i = NULL;
i = (int *) some_func();
// do stuff
if (i != NULL)
free(i);
i = NULL;
// do stuff
i = (int *) some_func();
// do stuff
if (i != NULL)
free(i);
i = NULL;
解決
1)some_func()との契約に依存します。 some_funcが戻り値でfree()を呼び出すことを期待している場合、コードは問題ありません。
2)Cで変数を再利用することは、それほどエレガントではありませんが、大丈夫です。一般的に、異なる目的に異なる変数を使用する方が良いです。パフォーマンスとメモリ使用量の観点からは、まったく同じことです。
他のヒント
これは、 some_func()
の動作に依存します。 malloc()
でメモリを割り当てている場合は、完了したら free()
する必要があります。そうでない場合は、そうすべきではありません。確認するには、関数のドキュメントを参照してください。
エドガーの2回目の答えをしたいのですが、ここでのNULLのテストは不要であることに注意してください:
if (i != NULL)
free(i);
free(NULL)が許可されているため。
コードは正常に見えます-どの特定のビットについて質問していますか?ただし、関数がint *を返す場合、キャストする必要はありません。キャストしない場合は、おそらくint *に割り当てるべきではありません。
まあ、私が見る唯一の問題は、Cだけでなく読みやすさの問題です。1つのブロックで変数名を何度も再利用したので、何に使うのかを見つけるのは本当に難しいです。
some_funcが動的に割り当てられたメモリを指すポインターを返す場合、はい。
some_func()が想定されていることを行う限り、問題ありません。無効な(未割り当ての)アドレスをiに割り当てると、プログラムがクラッシュします。
some_func()のコントラクトに依存。
some_func()がメモリを割り当て、それを解放する責任を指定する場合、yes free()で問題ありません。実際、バグではありません。
これは、管理されていない言語で作業する際のバグの1つです。所有しているリソースを追跡し、必ず解放する必要があります。
some_func()
" owns"の場合そのデータは、検査するためのポインタのみを返すため、解放しないでください。 malloc
sがあなただけのデータである場合、 free
最初のステップ
int *i;
// do stuff
i = NULL;
メモリを割り当てたものを指した場合、そのメモリは永久に失われませんか(メモリリーク)?
例:
int *i;
i = (int*) malloc(sizeof(int);
i = NULL;
intのサイズのメモリをエーテルに浮遊させたままにします。
some_func()の例でも同じことが言えますが、some_func()が残したものを解放しようとするために正しくテストしていると思います。特にsome_func()の仕組みがわからない場合。
some_func()がライブラリーからのものである場合、作業を行うfree_some_func(i)関数が存在する可能性があります。
i =(int *)some_func();
some_func()
の戻り値のタイプは言わなかったが、(int *)
の部分は少し疑わしい。 Cは一般にこれらのことについてかなり寛大であり、通常は明示的なキャストを必要とせずにきれいにコンパイルします。そうでない場合は、あなたがやっていることがあなたが望むように明確に定義され移植可能であるかどうかを慎重に検討してください。
@ケビン・モントローズ:うーん、そうですね、プログラマーに有能であることを要求するのは非常に難しいことです。天井に落ちた場合に備えて、コードを吊るすときは全員ヘルメットを着用したほうがよいかもしれません。そしてその「契約」とは何なのか some_func
? some_func
free に渡すのに適した値を返すか、そうでないかのどちらかです。そこには「契約」はありません。しかし、私は古い屁なので、管理者からブラウニーポイントを獲得するために難読化することは信じていません。これらは単純な概念です。
@カフェ:これはおそらくコンパイラ/ライブラリに依存します。彼と同じように確認したほうが安全です。NULL ポインターの無料チェックを実装したからといって、すべてがそうするわけではありません。
使用するたびに新しいポインターを宣言する代わりにintポインターを再利用してもよいということであれば、それは大丈夫ですが、一般的にすべての // do stuff
は多くのコードの。別のプログラマは、 * i
がどこから来たのか、なぜXがここに、Yがそこにあるのかについて混乱するかもしれません。