クラスがあります
class Sample
{
string strName;
};
Sample *obj = new Sample()
文字列が作成された場所を使用してサンプルのオブジェクトを作成した場合はどうなりstrName
ますか?スタックですか、それともヒープですか?
クラスがあります
class Sample
{
string strName;
};
Sample *obj = new Sample()
文字列が作成された場所を使用してサンプルのオブジェクトを作成した場合はどうなりstrName
ますか?スタックですか、それともヒープですか?
Sample obj = new Sample()
コンパイルされないので、どこにもありません。
つまりSample* obj = new Sample()
、動的ストレージ(ヒープ)にあります。
を呼び出すとdelete obj
、ヒープ上にある場合でも、文字列は自動的に削除されます。
og全体obj
が「ヒープ」上にあり、そのデータメンバーも同様です。ただし、データメンバーに割り当てられたメモリの管理について心配する必要はありません。削除obj
すると文字列も処理されます。
構造体、配列、ポインター、および基本的な数値型は、クラスが割り当てられている場所であればどこでも、クラスで作成されます。
文字列はもっと複雑です。それらは一種のコンテナです。コンテナを定義する文字列のメンバーは、サンプルクラス内のメンバーとしてクラスのメモリブロックに格納されます。文字列のテキストは、おそらくヒープ上の別の場所に割り当てられます(文字列クラスの実装によって異なります)。
さて、Sample* blah = new Sample();
そうすると、演算子newはヒープにメモリを割り当てます(ポインタはスタック上にあり、元々ヒープ上のクラスのメンバーである場合はヒープ上にあります)。
変数として使用するだけの場合は、スタックに格納されます。Sample blah;
strName
Sample
オブジェクトが配置されている場所に配置されます。ただし、クラスstring
は、通常の変数を使用するかどうかに関係なく、内部で任意のストレージをアドレス指定できます(その後、配置された場所にstring
配置され、何かへのポインタ、メモリマップは、常に、の反対側からXMLインターフェイスをクエリするだけです。地球。
ただし、string
何らかの方法でアドレスを格納する必要があるため、たとえば、そのポインタ、参照、URL、または使用されているアドレス指定スキームは、が配置されている場所にstring
配置されます。
関連する経験則:ポインタはそれ自体が値です(これが、オブジェクトのコピー状況で正しく処理するのが難しい理由です)。