11

私が書くなら:

char *a=malloc(sizeof(char)*4);
a="abc";
char *b="abc";

このメモリを解放する必要がありますか、それとも私のシステムによって行われますか?

4

6 に答える 6

16

あなたの状況では、動的に割り当てられたメモリへの参照を失っているため、動的に割り当てられたメモリを解放する方法はありません。

これを試してみてください:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char *a=(char*)malloc(sizeof(char)*4);
  printf("Before: %p\n",a);
  a = "abc";
  printf("After: %p\n",a);
  free(a);
  char *b = "abc";

  return 0;
}

あなたが得るでしょう

Before: 0x100100080
After: 0x100000f50

2つのポインタが異なることがわかります。これは、文字列リテラル"abc"がバイナリファイルのデータセクターに配置されるためです。

a = "abc"

のポインタをa定数リテラル文字列を指すように変更する"abc"と、以前に割り当てられたメモリが失われます。動的に割り当てられた有効なアドレスをポイントしなくなったという理由だけで、呼び出しfreeは正しくなくなりました。aポインタを保持して解放できるようにするには、次の文字列をコピーする必要があります。

strncpy(a, "abc", 4)

これにより、文字がリテラルから動的に割り当てられたメソッドに効果的にコピーされ、元のポインターが保持されます。

于 2012-04-08T13:46:19.793 に答える
5

ここでメモリリークが発生しました。を設定するa="abc"と、割り当てたばかりのメモリがいっぱいになるのではなく、静的文字列「abc」を指すようにポインタが再割り当てされます。 b同じ静的文字列を指します。

代わりに必要なのはstrncpy(a, "abc", 4)、「abc」の内容を割り当てたメモリ(をa指す)にコピーすることです。

次に、終了時にそれを解放する必要があります。

于 2012-04-08T13:45:34.023 に答える
3

簡単な答えはい、いいえ。また、コードにバグがあります。

具体的な答え:

char *a=malloc(sizeof(char)*4);

メモリを割り当てるので、それを解放する必要があります。

a="abc";

これにより、定数文字列へのポインタがに割り当てられますchar* a。そうすることで、最初の行に割り当てられたメモリへのポインタを失うため、定数文字列を解放しないでください。

strcpy(a,"abc");代わりにを使用a="abc";して、割り当てられたメモリに文字列を移動します。

于 2012-04-08T13:45:51.873 に答える
3

C では、この方法で文字列を代入することはできません

a = "abc"

ただし、使用する場合は、このようmallocに使用する必要がありますfree

free(a);

ただしfree(a)、例で使用するとエラーが発生することに注意してください。mallocポインタa値を静的文字列に変更した後"abc"; 次にfree(a)、静的データの解放を試みます。そして、エラーが発生します。

于 2012-04-08T13:41:36.993 に答える
0

はい、メモリリークが発生します。システムはケースを処理できませんでした。

于 2012-04-08T15:39:02.920 に答える
0

はい、malloc によって返されたメモリを解放する必要があります。

于 2012-04-08T13:41:02.277 に答える