这取决于你的内存是如何分配的。
对于您粘贴的代码:
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 的析构函数中编写自由/删除代码。并将 a 放入由 {} 包装的范围内,当 a 超出范围时将调用析构函数(由 c++ 编译器自动完成)。就像提到的@Alok 和@Luchian 一样。
如果您的内存以成员变量的形式分配,如下所示:
A类{ char foo[16]; };
当代码为A a;
“foo”时,作为 A 实例的一部分在堆栈上分配。你不能做任何事情。
当代码是A *pa = new A();
然后在 A 上分配对象时,请随意删除它。 delete pa;