1

I have this code:

char* value = "abcdefg";

char* secondValue = value;

The second value will get the addres of value ok? If I delete "value" the secondValue won't be available am I right?

so I should do:

char* value = "abcdefg";
secondValue = new char[strlen(value)];
strcpy(secondValue, value);

so If I delete "value" no problem.

And finally to dealloc the secondValue I should do:

delete[] secondValue;

am I right?

4

3 に答える 3

6

あなたが書いたものには2つの問題があります:

  1. char *value = "abcdefg";はヒープに割り当てられていないため、削除できません。ヒープ メモリを割り当てるにはnew、(C++ の場合) またはmalloc(C の場合) を使用します。

  2. 文字列にメモリを割り当てるときは、ヌル終端用にもう 1 バイト余分に必要です。

あなたの場合、次のことを行う必要があります。

secondValue = new char[strlen(value)+1];

それ以外は、あなたは正しいです

于 2010-11-20T19:25:39.793 に答える
3

C++ を使用している場合は、secondValue1 文字大きくする必要があることを除いて、正しいです。

secondValue = new char[strlen(value) + 1];

C スタイルの文字列は文字で終了し、'\0'格納するスペースも必要です。

C++ の代わりに Cを使用している場合、 neworはなく、代わりdelete[]に関数malloc()andを使用する必要があります。free()

secondValue = malloc(strlen(value) + 1);
...
free(secondValue);

いずれにせよ、この例valueは文字列リテラルであり、削除/解放できないことに注意してください。それぞれ new/malloc で割り当てたもののみを削除/解放する必要があります。

于 2010-11-20T19:27:58.983 に答える
1

コードを書いた方法:

char* value = "abcdefg";

コンパイラは静的文字列を生成し"abcdefg"、それvalueへのポインタになります。割り当てsecondvalue = valueて、value go out of scope, andsecondvalue` を引き続き有効にすることができます。

あなたの例では、割り当てを解除する他の方法はありませんvalue

于 2010-11-20T19:28:41.447 に答える