2015-12-02 60 views
2

我特別使用C++: 當我在一個函數中創建一個對象時,這個對象會保存在堆棧還是堆上?在函數中創建的對象,是保存在堆棧還是堆上?

原因我所要求的是因爲我需要保存一個指向一個對象的指針,並且唯一可以創建的對象位於函數內,所以如果我有一個指向該對象的指針並且方法結束,指針可能會指向垃圾後。 - >如果我將一個指向對象的指針添加到列表(這是該類的成員),然後方法結束,那麼我可能會讓列表中的元素指向垃圾。

所以再次 - 當在一個方法中創建對象時,是將它保存在堆棧上(在函數結束後它將不相關)還是保存在堆上(因此我可以指向它而不會導致任何錯誤問題..)?

例如:

class blah{ 
private: 
    list<*blee> b; 
public: 
    void addBlee() { 
     blee b; 
     blee* bp = &b; 
     list.push_front(bp); 
    } 
} 

可以忽略語法問題 - 以上只是理解的概念和困境......

謝謝大家!

回答

1
void addBlee() { 
    blee b;    // this is created on the stack 
    blee* bp = &b; 
    list.push_front(bp); // this is a pointer to that object 
} // after this brace b no longer exists, hence you have a dangling pointer 

而是執行此操作:

list.push_front(new blee); // this is created on the heap and 
          // therefore it's lifetime is until you call 
          // delete on it` 
4

請記住以下事情:將對象從未在堆上創建(更準確地稱爲C++「動態存儲」),除非明確地使用在堆上分配new operatormalloc變體。

其他一切都是堆棧/寄存器(在C++中應該稱爲「自動存儲」)或靜態分配的變量。靜態分配變量的一個例子是程序中的全局變量,聲明爲static的靜態或靜態數據成員的函數局部變量。

你還需要非常清楚指針和對象本身之間的歧義。在下面一行:

void foo() { 
    int* i = new int(42); 
} 

int動態分配(在堆上),而指向所分配INT具有自動存儲(堆棧或寄存器)。結果,一旦退出foo(),指針將被刪除,但動態分配的對象仍然沒有任何方式訪問它。這被稱爲經典內存泄漏

+0

只有一個小小的更正:你說的「全局變量」,也許它會被連擊說靜態分配 - 其中全局變量是可能的情況之一。 – Paulo1205

+0

@ Paulo1205,的確如此。將更新。 – SergeyA

2

堆是動態內存分配通常發生的部分,因此當您將內存明確分配給程序中的任何內容時,您已從堆分段中爲內存分配內存。

Obj yo = new Obj; //something like this. 

堆棧是存儲自動變量的另一個段,以及每次調用函數時保存的信息。

就像當我們聲明:

*int* variable; 

這將是在棧上和它的有效性只有直到一個特定函數退出,而變量,對象等就堆在那兒待到主()結束。

+0

給這個讀數 http://stackoverflow.com/questions/6337294/creating-an-object-with-or-without-new – Rusty

相關問題