2010-06-26 63 views

回答

3

这意味着全部为对象的数据被分配在堆栈上,并且当电流方法终止将被弹出。

替代方案(发生在C#和Java中,或者如果您在C++中使用指针)是在堆栈上有一个引用或指针,它指向在堆上分配的对象数据。

我认为这里的“内联”仅仅意味着“作为该方法的堆栈框架的一部分”,而不是与该方法分开存在。

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++这样的语言中,类对象可以像ints或floats那样直接进入堆栈。除非您明确呼叫new,否则不会使用堆中的内存。请注意,我们的on_the_heap对象永远不会被释放(通过调用delete),所以它会导致内存泄漏。另一方面,on_the_stack对象在函数返回时会自动释放,并且在此之前调用它的析构函数。