それは、aによってメモリがどのように割り当てられるかによって異なります。
貼り付けたコードの場合:
g++ -gstabs -o a cpptest.cpp
objdump -d ./a
0000000000400554 <main>:
400554: 55 push %rbp
400555: 48 89 e5 mov %rsp,%rbp
400558: 48 83 ec 20 sub $0x20,%rsp
40055c: 89 7d ec mov %edi,-0x14(%rbp)
40055f: 48 89 75 e0 mov %rsi,-0x20(%rbp)
400563: 48 8d 45 ff lea -0x1(%rbp),%rax
400567: 48 89 c7 mov %rax,%rdi
40056a: e8 13 00 00 00 callq 400582 <_ZN1A7method1Ev>
40056f: 48 8d 45 fe lea -0x2(%rbp),%rax
400573: 48 89 c7 mov %rax,%rdi
400576: e8 11 00 00 00 callq 40058c <_ZN1B7method2Ev>
40057b: b8 00 00 00 00 mov $0x0,%eax
400580: c9 leaveq
400581: c3 retq
この正確なケースでは、オブジェクト a/b のメモリはスタックにあります。によって割り当てられた
400558: 48 83 ec 20 sub $0x20,%rsp
クラスにメンバー変数がないため、クラスのインスタンスは 1 バイトを消費します (クラスのインスタンスを区別するために C++ コンパイラによって行われます)。
a の「this」ポインターが _ZN1A7method1Ev (method1) に転送されていることがわかります。
400563: 48 8d 45 ff lea -0x1(%rbp),%rax
400567: 48 89 c7 mov %rax,%rdi
この正確なコード ケースでは、b の前に a のメモリ (スタック上) を解放する必要はなく、解放することもできません。
Aによって割り当てられたメモリを意味する場合は、 malloc/new によって。次に、A のデストラクタに free/delete コードを記述する必要があります。{} でラップされたスコープに a を配置すると、スコープ外のときにデストラクタが呼び出されます (これは C++ コンパイラによって自動的に行われます)。@Alokと@Luchianが言及したように。
次のように、メモリがメンバー変数の形式で割り当てられている場合:
クラス A{ char foo[16]; };
code がA a;
A のインスタンスの一部として "foo" がスタックに割り当てられている場合、何もできません。
コードがA *pa = new A();
A に割り当てられている場合は、自由に削除してください。 delete pa;