4

たとえば、while ループの外側でメモリを割り当てた場合、内側で解放しても問題ありませんか? これら 2 つのコードは同等ですか?

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
  free(memory);
}


int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
}
free(memory);
4

6 に答える 6

5

はい、同等です。free()割り当てが成功しなかった場合は、電話をかける必要はありません。
注意してください、それmemoryはへのポインタでintあり、メモリブロックに何かを割り当てるためにそれを逆参照する必要があります。

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory)
    *memory=10;
free(memory);
memory = NULL;
于 2010-01-10T20:21:35.230 に答える
4
int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
  free(memory);
}

これはクラッシュします。ポインタをメモリ位置10に設定してから、システムにメモリを解放するように要求しています。仮想アドレス空間のクレイジーな世界でも、たまたま10(16進数で0xA)から始まるメモリを以前に割り当てたことはほとんどありません。さらに、mallocが失敗した場合、メモリは割り当てられていないため、解放する必要はありません。

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
}
free(memory);

これもバグです。mallocが失敗した場合は、ポインタを10に設定し、そのメモリを解放しています。(以前と同じように)mallocが成功すると、すぐにメモリが解放されます。つまり、メモリを割り当てるのは無意味です。さて、これは要点を理解するために簡略化された単なるサンプルコードであり、これは実際のプログラムには存在しないと思いますか?:)

于 2010-01-10T20:39:07.377 に答える
3

一度だけ解放することが確実であれば問題ありません。

解放するときは常にポインターを =NULL に設定することをお勧めします。その後、再び解放されても問題ありません。

于 2010-01-10T20:15:40.477 に答える
1

まず第一に、あなたはそれを一度だけ解放することができます。したがって、(質問が示唆するように)ループ内でそれを解放したい場合は、2番目の解決策が唯一の正しい方法です。

ifステートメント内でそれを解放したい場合は、両方のソリューションが技術的に正しいです。ただし、使用するメモリを常に解放することをお勧めします。そうすれば、ifステートメントの外側の最後で常にメモリを解放する方が簡単です。

だから私のアドバイスは:あなたがやろうとしていることは何でも:常にloop / ifステートメントの外でメモリを解放する(もちろんもうそれを必要としないと仮定して)。私は通常、それが最後に使用された関数の最後でそれを解放しますが、それは実際には関数自体、その長さ、...に依存します。

あなたのやり方を見つけてそれに固執してみてください:それはあなたに多くの無駄な脳の時間を節約します(これは本当に貴重です)

于 2010-01-10T20:26:16.640 に答える
1

私が従うのが好きな一般的な経験則は、割り当てられたのと同じスコープでメモリを解放することです。

于 2010-01-10T20:50:33.633 に答える
1

はい。大事なことは、一度自由すぎることです。(メモリを使い終わった後)

于 2010-01-10T20:15:46.937 に答える