0

これは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;
4

13 に答える 13

6

1) これは、some_func() との契約によって異なります。some_func が戻り値に対して free() を呼び出すことを期待している場合、コードは問題ありません。

2) 非常にエレガントではありませんが、C で変数を再利用することは問題ありません。通常は、目的ごとに異なる変数を使用する方が適切です。パフォーマンスとメモリ使用量の観点からは、まったく同じです。

于 2009-07-29T14:03:21.233 に答える
3

それは何をしているかによって異なりsome_func()ます。でメモリを割り当てている場合はmalloc()、完了したらfree()それを行う必要があります。そうでない場合は、すべきではありません。確実にするには、関数のドキュメントを参照してください。

于 2009-07-29T14:00:47.727 に答える
3

私は Edgar の答えに賛成しますが、ここでの NULL のテストは不要であることにも注意してください。

if (i != NULL)
    free(i);

free(NULL) が許可されているためです。

于 2009-07-29T14:17:42.570 に答える
2

あなたのコードは問題ないように見えます - どの特定のビットについて質問していますか? ただし、関数が int * を返す場合、キャストは必要ありません。そうでない場合は、おそらく int * に代入しないでください。

于 2009-07-29T14:00:10.847 に答える
1

私が目にする唯一の問題は、C だけに限らない可読性の問題です。変数名を 1 つのブロックで何度も再利用したため、その変数が何に使用されているかを見つけるのは非常に困難です。

于 2009-07-29T14:02:44.120 に答える
0

@Kevin Montrose:うーん、そうですね、プログラマーに有能であることを要求することは、本当に大きな問題です。天井が落ちた場合に備えて、コードをスリングするときは全員ヘルメットを着用する必要があるかもしれません。そして、の「契約」とはsome_func何ですか?some_funcfreeに渡すのに適した値を返すか、返さないかのどちらかです。そこには「契約」はありません。しかし、私は古いオナラであり、経営陣と一緒にブラウニーポイントを獲得するための難読化を信じていません。これらは単純な概念です。

@caf:これはおそらくコンパイラ/ライブラリに依存します。彼がしているようにチェックする方が安全です。NULLポインターの無料チェックを実装したからといって、すべてがそうなるとは限りません。

于 2009-07-29T14:45:12.743 に答える
0

i = (int *) some_func();

返品タイプが何であるかは言わなかったsome_func()が、その(int *)部分は少し疑わしい。Cは通常、これらのことについてかなり寛大であり、通常、明示的なキャストを必要とせずにクリーンにコンパイルされます。そうでない場合は、実行していることが、希望どおりに明確に定義され、移植可能であるかどうかを慎重に検討してください。

于 2009-07-29T14:30:37.213 に答える
0

あなたの最初のステップで

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) 関数が存在する可能性があります。

于 2009-07-29T14:28:32.523 に答える
0

使用するたびに新しいポインターを宣言する代わりに、int ポインターを再利用しても問題ありませんが、一般に、すべて// do stuffが多くのコードで構成されていると混乱する可能性があります。別のプログラマーは、どこ*iから来たのか、なぜ X がここにあり、Y がそこにあるのかについて混乱するかもしれません。

于 2009-07-29T14:01:14.717 に答える
0

some_func が動的に割り当てられたメモリを指すポインターを返す場合、はい。

于 2009-07-29T14:01:28.820 に答える
0

some_func() が本来の機能を果たしている限り問題ありません。無効な (割り当てられていない) アドレスを i に割り当てると、プログラムがクラッシュします。

于 2009-07-29T14:02:00.907 に答える
0

some_func() の規約に依存します。

some_func() がいくらかのメモリを割り当て、それを解放する責任があると指定する場合、はい、それを free() しても問題ありません。実際、それはバグです。

これは、管理されていない言語で作業する際のバグベアの 1 つです。所有しているリソースを追跡し、それらを確実に解放する必要があります。

于 2009-07-29T14:02:54.153 に答える
0

がそのsome_func()データを「所有」しており、検査のためにポインタを返すだけの場合は、解放しないでください。それmallocがあなたのためだけのものなら、あなたは本当に責任がありますfree

于 2009-07-29T14:03:08.520 に答える