これは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()
それを行う必要があります。そうでない場合は、すべきではありません。確実にするには、関数のドキュメントを参照してください。
私は Edgar の答えに賛成しますが、ここでの NULL のテストは不要であることにも注意してください。
if (i != NULL)
free(i);
free(NULL) が許可されているためです。
あなたのコードは問題ないように見えます - どの特定のビットについて質問していますか? ただし、関数が int * を返す場合、キャストは必要ありません。そうでない場合は、おそらく int * に代入しないでください。
私が目にする唯一の問題は、C だけに限らない可読性の問題です。変数名を 1 つのブロックで何度も再利用したため、その変数が何に使用されているかを見つけるのは非常に困難です。
@Kevin Montrose:うーん、そうですね、プログラマーに有能であることを要求することは、本当に大きな問題です。天井が落ちた場合に備えて、コードをスリングするときは全員ヘルメットを着用する必要があるかもしれません。そして、の「契約」とはsome_func
何ですか?some_func
freeに渡すのに適した値を返すか、返さないかのどちらかです。そこには「契約」はありません。しかし、私は古いオナラであり、経営陣と一緒にブラウニーポイントを獲得するための難読化を信じていません。これらは単純な概念です。
@caf:これはおそらくコンパイラ/ライブラリに依存します。彼がしているようにチェックする方が安全です。NULLポインターの無料チェックを実装したからといって、すべてがそうなるとは限りません。
i = (int *) some_func();
返品タイプが何であるかは言わなかったsome_func()
が、その(int *)
部分は少し疑わしい。Cは通常、これらのことについてかなり寛大であり、通常、明示的なキャストを必要とせずにクリーンにコンパイルされます。そうでない場合は、実行していることが、希望どおりに明確に定義され、移植可能であるかどうかを慎重に検討してください。
あなたの最初のステップで
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) 関数が存在する可能性があります。
使用するたびに新しいポインターを宣言する代わりに、int ポインターを再利用しても問題ありませんが、一般に、すべて// do stuff
が多くのコードで構成されていると混乱する可能性があります。別のプログラマーは、どこ*i
から来たのか、なぜ X がここにあり、Y がそこにあるのかについて混乱するかもしれません。
some_func が動的に割り当てられたメモリを指すポインターを返す場合、はい。
some_func() が本来の機能を果たしている限り問題ありません。無効な (割り当てられていない) アドレスを i に割り当てると、プログラムがクラッシュします。
some_func() の規約に依存します。
some_func() がいくらかのメモリを割り当て、それを解放する責任があると指定する場合、はい、それを free() しても問題ありません。実際、それはバグです。
これは、管理されていない言語で作業する際のバグベアの 1 つです。所有しているリソースを追跡し、それらを確実に解放する必要があります。
がそのsome_func()
データを「所有」しており、検査のためにポインタを返すだけの場合は、解放しないでください。それmalloc
があなたのためだけのものなら、あなたは本当に責任がありますfree