2
char* myChar=new char[20];
char* myChar2="123";
strcpy(myChar, myChar2);

...

delete[] myChar;

私の質問は、 の最後に a を配置strcpyすると、最初の 3 文字のみが削除され、残りの?は削除されないということです。'\0'"123"delete[] myCharmyChar

ありがとうございました...

4

5 に答える 5

3

いいえ、によって返されたものと同じアドレスを に渡す限り、delete []によって割り当てられたすべてのメモリの割り当てが解除されます。 そのメモリに何が配置されているかに関係なく、割り当てられたメモリの量を正しく記憶しています。new []delete []new []

于 2013-05-18T05:55:47.113 に答える
1

文字列を削除するとき、Delete は「\n」を探しません。

代わりに、コンパイラは文字列にメモリ チャンクを割り当てるときに "\n" を探します。

したがって、myChar と myChar2 の両方を削除すると、特定のポインターに実際に割り当てられたメモリ チャンクのサイズを確認することで、まったく同じように機能します。これは、あなたの状況でメモリリークがないことを意味します。

于 2013-05-18T05:57:40.407 に答える
1

これは、理解が必要な C++ の基本的な側面です。それは根拠のある混乱を引き起こします。例を見てください:

char* myChar1 = new char[20];
char* myChar2 = (char*)malloc(20);

両方のポインターが同じ型であるという事実にもかかわらず、異なるメソッドを使用して、それらが指しているオブジェクトを解放する必要があります。

delete [] myChar1;
free(myChar2);

その場合、次のことに注意してください。

char *tmp = myChar1;
myChar1 = myChar2;
myChar2 = myChar1;

その後、次のものが必要です。

delete [] myChar2;
free(myChar1);

このオブジェクトへのポインターを保持する場所ではなく、オブジェクト自体 (つまり、どのように割り当てられたか) を追跡する必要があります。そして、このオブジェクトに関する情報を保存する場所ではなく、解放したいオブジェクトを解放します。

于 2013-05-18T05:58:59.887 に答える
1

delete[] は、実際に使用した 3+1 だけでなく、20 文字すべての割り当てを解除します。

于 2013-05-18T05:59:47.970 に答える