2013-07-03 51 views
0

我有一個簡單的問題。 如果我有這樣的代碼:存在指針

void Holder::Add() 
{ 
    Dish * obj = new Dish(this->screen_width, this->screen_height); 
    this->dish_array.push_back(obj); 
} 

其中dish_array聲明,像這樣:

vector <Dish*> dish_array; 

將是「* OBJ」指針所指向的對象爲「存在」這一功能之外?

+0

請不要將原始指針存儲在容器中,除非*絕對*無法避免(這種情況極少),它們是維護噩夢和錯誤/泄漏的重要來源。優選存儲普通對象('vector ')或至少智能指針('vector >'或'vector '')的容器。作爲我剛纔所說的一個例子:你的兩行代碼('new/push_back')會泄漏內存,因爲它們不是異常安全的。這只是冰山一角。 – syam

+0

@JapeCorbel我忘了說,好標題:) – feralin

回答

1

是的,它當然會。但是,有兩種方法可以定義「存在」:

1)您可以在函數之外引用/使用它嗎?在這種情況下,您可以這樣做,因爲您的obj值已放入dish_array變量中,該變量現在存儲對您創建的對象的引用。

2)對象是否仍在內存中?在這種情況下,是的。你永遠不會釋放物體。但是,如果您從未擁有行this->dish_array.push_back(obj),那麼該對象仍將保留在內存中,但您無法引用它。這將是一個內存泄漏

0

是的。這是在免費商店中分配的new的副作用,因此需要您應用手動清理。

+0

沒有真正的副作用。這是預期的行爲,而且在某些情況下,新堆棧變量的優點之一就是它。 – paul

+2

這當然是預期的行爲,但仍然是一個副作用,因爲它會改變程序狀態。據說修改程序狀態的函數具有副作用,而純函數(不涉及任何狀態)則不具有副作用。也就是說,重複調用函數不會重複執行相同的操作,儘管看起來相反。在這種情況下,重複調用'new'不會導致重複創建* same *對象(出於顯而易見的原因)。 – user268396

+0

對不起,我頭腦中有不良副作用 – paul

0

是的。您正在使用new關鍵字特別請求您的新實例Dish即使在Holder::Add返回後仍保持活動狀態(不是垃圾)。它將保持在堆上,直到你用delete釋放它的內存。不要忘記在某個時候這樣做,否則你會有內存泄漏!

0

是 - 對new的調用返回指向已分配內存的指針。您正在將此指針的副本存儲在您的vector中。分配的內存將一直存在,直到您主動調用指針上的刪除。爲了避免代碼中的內存泄漏,您需要遍歷向量中的指針,並在向量超出範圍之前調用它們的delete(無論何處)。當然,除非你在其他地方刪除它們,並在那個時候調用刪除它們。 當一個向量被銷燬時,向量中的所有項也被銷燬 - 在這種情況下,你只有指針,所以即使指針被銷燬,它指向的內存也不會被釋放,直到你調用該指針的delete。

0

C++沒有任何垃圾回收。使用mallocnew在堆上分配的任何內存將一直存在,直到手動釋放,使用freedelete。所以是的。

0

是的。代碼示例中的矢量與您的問題完全無關。重要的是new關鍵字。您分配的對象new保留在內存中,直到1)您delete指針或2)您的程序結束並且操作系統回收您的內存。如果你的向量超出範圍,所有的指針消失,它們指向的對象仍然存在,現在泄漏。

每個new應該有一個相應的delete或者你應該把你得到的指針,爲你照顧(如shared_ptr)。

0

是的,您使用new創建的Dish類型的未命名對象將繼續存在於該函數之外。

但是,這與您在問題標題中提到的「存在指針」無關。未命名的對象的類型爲Dish。它不是一個指針。它與您的obj指針無關。

指針obj將在函數退出時消失,而用於指向的未命名的Dish對象將繼續存在。您有責任確保obj指針的值在obj消失之前存儲在某處。這樣,您可以繼續保持對使用new創建的未命名的Dish對象的評估。