我们假设我有一个类Foo和一个函数Bar
void Bar(void)
{
Foo a();
}
这是否意味着必须在主存中分配一个必须的?
或者这取决于编译器,因此编译器可能会分配内存并导致与编写Foo* a=new Foo
答案 0 :(得分:2)
Foo a();
是一个函数声明。它应该是Foo a
;并且a
在堆栈的记忆中。
答案 1 :(得分:1)
您正在寻找的术语是自动变量。这意味着该变量中包含的对象保证在范围自动的末尾被销毁。
当你使用new
时,只有当你delete
显式地(或者通过明确地使用一种负责破坏它的机制,如智能指针)时,对象才会被销毁。换句话说,生命周期是手动管理。
当然,自动生命周期语义在任何情况下都与手动语义不同。话虽这么说,两种情况下的存储位置(堆栈,堆,寄存器或其他东西)都无关紧要。
答案 2 :(得分:0)
从技术上讲,如果a
适合寄存器,它最终可能会使用“无记忆”。否则,它将被分配在堆栈中,我将其称为“主内存”,与Foo *a = new Foo;
相同的内存,但不同的部分[new
使用堆内存,堆栈不是与堆相同,但内存相同。
当然,如果类Foo
包含构造函数,它本身可以调用new
以及可能会或可能不会改变内存使用的所有其他函数......