char * = “string” または char * = new char[6] を破棄する必要がありますか?

StackOverflow https://stackoverflow.com/questions/51592

  •  09-06-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

いいえ。手動で文字列を解放する必要があるのは、 malloc 関数 (C の場合) または new 演算子 (C++ の場合)。使用しない場合 malloc または new, 、 そうして char* または文字列はスタック上に、またはコンパイル時の定数として作成されます。

他のヒント

いいえ。あなたが言う時:

const char* c = "Hello World!";

c を「既存の」文字列定数に割り当てています。これは次のものと同じではありません。

char* c = new char[6];

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

私がそうするとき、私は仮定します char* = "string" それは同じことです char* = new char[6].

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

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

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

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

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

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

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

const char* c = "string";

そして、 新しい char配列は次のようにする必要があります 消去d は、動的に割り当てられる他のメモリ領域と同様です。

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

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

char* const sz1 = "string"; // embedded string, immutable buffer
char* sz2 = new char[10]; // allocated string, should be deleted

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++ -ggdb -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[]. 。したがって、できる限り解放する必要があります。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top