char* = "string"
と同じだと思いchar* = new char[6]
ます。これらの文字列は、スタックではなくヒープ上に作成されると思います。それで、それらを使い終わったら、それらを破棄するか、メモリを解放する必要がありますか、それとも自然に破棄されますか?
8 に答える
malloc
いいえ。関数 (C の場合) またはnew
演算子 (C++ の場合)を使用して自分でメモリを手動で割り当てる場合にのみ、文字列を手動で解放する必要があります。malloc
orを使用しない場合new
、char*
or 文字列がスタック上に作成されるか、コンパイル時の定数として作成されます。
いいえ。次のように言うと:
const char* c = "Hello World!";
次と同じではない「既存の」文字列定数に c を割り当てています。
char* c = new char[6];
後者の場合にのみ、ヒープにメモリを割り当てます。したがって、完了したら delete を呼び出します。
ゲームの名前は「作ったものだけを破壊する」。ペアは次のとおりです。
malloc
/free
calloc
/free
new
/delete
new []
/delete []
を使用して 2 番目の文字列を作成したので、new []
それを で破棄する責任はあなたにありますdelete []
。delete [] string2
終わったら電話。
コードが非常に複雑で削除の追跡が困難な場合は、スコープ ポインターまたは自動ポインターの使用を検討してください。ブースト ライブラリのboost::scoped_ptr
クラスは、開始するのに適した場所です。また、非常に便利で便利なRAIIイディオムも調べてください。
char* = "string"
と同じことをすると思いますchar* = new char[6]
。
いいえ。最初に行うことは、定数を作成することです。それを変更すると、未定義の動作になります。しかし、あなたの質問に答えるために; いいえ、それらを破壊する必要はありません。そして、std::string
可能な限り常に使用してください。
それらは同じではありません。最初の例は定数文字列であるため、ヒープからは確実に割り当てられません。2 番目の例は、6 文字のランタイム メモリ割り当てで、ヒープからのものです。最初の例は削除したくありませんがdelete []
、2 番目の例は削除する必要があります。
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[]
。したがって、できるときに解放する必要があります。
文字列リテラルがどこに格納されているかわかりません。読み取り専用メモリの場合もあるため、コードは次のようになります。
const char* c = "string";
また、新しいchar 配列は、他の動的に割り当てられたメモリ領域と同様に削除する必要があります。
new は常に割り当てですが、文字列をインラインで定義すると、実際にはプログラム自体にデータが埋め込まれ、変更できません (一部のコンパイラでは、スマートなトリックでこれを許可していますが、気にしないでください)。
一部のコンパイラは、バッファを変更できないようにインライン文字列を入力します。
char* const sz1 = "string"; // embedded string, immutable buffer
char* sz2 = new char[10]; // allocated string, should be deleted