16

char* = "string"と同じだと思いchar* = new char[6]ます。これらの文字列は、スタックではなくヒープ上に作成されると思います。それで、それらを使い終わったら、それらを破棄するか、メモリを解放する必要がありますか、それとも自然に破棄されますか?

4

8 に答える 8

33

mallocいいえ。関数 (C の場合) またはnew演算子 (C++ の場合)を使用して自分でメモリを手動で割り当てる場合にのみ、文字列を手動で解放する必要があります。mallocorを使用しない場合newchar*or 文字列がスタック上に作成されるか、コンパイル時の定数として作成されます。

于 2008-09-09T11:02:44.480 に答える
17

いいえ。次のように言うと:

const char* c = "Hello World!";

次と同じではない「既存の」文字列定数に c を割り当てています。

char* c = new char[6];

後者の場合にのみ、ヒープにメモリを割り当てます。したがって、完了したら delete を呼び出します。

于 2008-09-09T11:04:51.120 に答える
4

ゲームの名前は「作ったものだけを破壊する」。ペアは次のとおりです。

  1. malloc/free
  2. calloc/free
  3. new/delete
  4. new []/delete []

を使用して 2 番目の文字列を作成したので、new []それを で破棄する責任はあなたにありますdelete []delete [] string2終わったら電話。

コードが非常に複雑で削除の追跡が困難な場合は、スコープ ポインターまたは自動ポインターの使用を検討してください。ブースト ライブラリのboost::scoped_ptrクラスは、開始するのに適した場所です。また、非常に便利で便利なRAIIイディオムも調べてください。

于 2010-09-12T05:25:07.043 に答える
4

char* = "string"と同じことをすると思いますchar* = new char[6]

いいえ。最初に行うことは、定数を作成することです。それを変更すると、未定義の動作になります。しかし、あなたの質問に答えるために; いいえ、それらを破壊する必要はありません。そして、std::string可能な限り常に使用してください。

于 2008-09-09T11:02:20.410 に答える
3

それらは同じではありません。最初の例は定数文字列であるため、ヒープからは確実に割り当てられません。2 番目の例は、6 文字のランタイム メモリ割り当てで、ヒープからのものです。最初の例は削除したくありませんがdelete []、2 番目の例は削除する必要があります。

于 2008-09-09T11:02:11.003 に答える
1

GCC 4.8 x86-64 Linux の機能を見てみましょう

プログラム:

#include <cstdio>
int main() {
    const char *s = "abc";
    char *sn = new char[4];
    sn[3] = '\0';
    std::printf("%s\n", s);
    std::printf("%s\n", sn);
}

コンパイルと逆コンパイル:

g++ -c -ggdb -o a.o -std=c++98 a.cpp
objdump -CSr a.o

出力には次が含まれます。

  const char *s = "abc";
 8:   48 c7 45 f0 00 00 00    movq   $0x0,-0x10(%rbp)
 f:   00 
                     c: R_X86_64_32S .rodata
  char *sn = new char[4];
10:   bf 04 00 00 00          mov    $0x4,%edi
15:   e8 00 00 00 00          callq  1a <main+0x1a>
                        16: R_X86_64_PC32       operator new[](unsigned long)-0x4
1a:   48 89 45 f8             mov    %rax,-0x8(%rbp)

解釈:

  • char *s = "abc"に入り.rodataます。だからあなたは決してそれをすることはできませんfree
  • char *sn = new char[4];の出力から来ますoperator new[]。したがって、できるときに解放する必要があります。
于 2015-06-05T12:26:23.890 に答える
1

文字列リテラルがどこに格納されているかわかりません。読み取り専用メモリの場合もあるため、コードは次のようになります。

const char* c = "string";

また、新しいchar 配列は、他の動的に割り当てられたメモリ領域と同様に削除する必要があります。

于 2008-09-09T11:01:15.467 に答える
0

new は常に割り当てですが、文字列をインラインで定義すると、実際にはプログラム自体にデータが埋め込まれ、変更できません (一部のコンパイラでは、スマートなトリックでこれを許可していますが、気にしないでください)。

一部のコンパイラは、バッファを変更できないようにインライン文字列を入力します。

char* const sz1 = "string"; // embedded string, immutable buffer
char* sz2 = new char[10]; // allocated string, should be deleted
于 2008-09-09T11:04:50.513 に答える