2010-06-26 74 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對象在函數返回時會自動釋放,並且在此之前調用它的析構函數。