char * = “string” または char * = new char[6] を破棄する必要がありますか?
質問
私はそう仮定します 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
いつでも可能なとき。
ゲームの名は「自分が作ったものだけを破壊する」。ペアは次のとおりです。
malloc
/free
calloc
/free
new
/delete
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[]
. 。したがって、できる限り解放する必要があります。