当它说“在堆栈中内联对象分配”时,这是什么意思?
特别是'内联'位
答案 0 :(得分:3)
这意味着对象的所有数据都在堆栈上分配,并在当前方法终止时弹出。
替代方案(在C#和Java中发生,或者如果你在C ++中使用指针)是在堆栈上有一个引用或指针,它指的是在堆上分配的对象数据。
我认为这里的“内联”只意味着“作为此方法的堆栈框架的一部分”,而不是与该方法分开存在。
答案 1 :(得分:2)
嗯,你知道堆栈是什么,对吗?如果你在C:中声明一个函数:
int foo() {
int bar = 42;
return bar;
}
调用该函数时,会为堆栈上的函数创建一些空间,并在那里分配整数bar
。当函数返回时,该堆栈帧中的所有内容都将被释放。
现在,在C ++中:
class A {
int a;
int b;
A(int x, int y) {
a = x;
b = y;
}
~A() { // destructor
cout << "A(" << a << "," << b << ") being deleted!" << endl;
}
}
void foo() {
A on_the_stack(1,2);
A *on_the_heap = new A(3,4);
}
在Java等语言中,所有对象都在堆上分配(除非编译器进行某种优化)。但是在某些语言(如C ++)中,类对象可以像int
s或float
一样直接在堆栈上。除非您明确调用new
,否则不会使用堆中的内存。请注意,我们的on_the_heap
对象永远不会被释放(通过调用它上面的delete
),因此会导致内存泄漏。另一方面,on_the_stack
对象在函数返回时自动释放,并且在执行此操作之前将调用其析构函数。