我有一個簡單的問題。 如果我有這樣的代碼:存在指針
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」指針所指向的對象爲「存在」這一功能之外?
我有一個簡單的問題。 如果我有這樣的代碼:存在指針
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」指針所指向的對象爲「存在」這一功能之外?
是的,它當然會。但是,有兩種方法可以定義「存在」:
1)您可以在函數之外引用/使用它嗎?在這種情況下,您可以這樣做,因爲您的obj
值已放入dish_array
變量中,該變量現在存儲對您創建的對象的引用。
2)對象是否仍在內存中?在這種情況下,是的。你永遠不會釋放物體。但是,如果您從未擁有行this->dish_array.push_back(obj)
,那麼該對象仍將保留在內存中,但您無法引用它。這將是一個內存泄漏。
是的。這是在免費商店中分配的new
的副作用,因此需要您應用手動清理。
沒有真正的副作用。這是預期的行爲,而且在某些情況下,新堆棧變量的優點之一就是它。 – paul
這當然是預期的行爲,但仍然是一個副作用,因爲它會改變程序狀態。據說修改程序狀態的函數具有副作用,而純函數(不涉及任何狀態)則不具有副作用。也就是說,重複調用函數不會重複執行相同的操作,儘管看起來相反。在這種情況下,重複調用'new'不會導致重複創建* same *對象(出於顯而易見的原因)。 – user268396
對不起,我頭腦中有不良副作用 – paul
是的。您正在使用new
關鍵字特別請求您的新實例Dish
即使在Holder::Add
返回後仍保持活動狀態(不是垃圾)。它將保持在堆上,直到你用delete
釋放它的內存。不要忘記在某個時候這樣做,否則你會有內存泄漏!
是 - 對new的調用返回指向已分配內存的指針。您正在將此指針的副本存儲在您的vector
中。分配的內存將一直存在,直到您主動調用指針上的刪除。爲了避免代碼中的內存泄漏,您需要遍歷向量中的指針,並在向量超出範圍之前調用它們的delete(無論何處)。當然,除非你在其他地方刪除它們,並在那個時候調用刪除它們。 當一個向量被銷燬時,向量中的所有項也被銷燬 - 在這種情況下,你只有指針,所以即使指針被銷燬,它指向的內存也不會被釋放,直到你調用該指針的delete。
C++沒有任何垃圾回收。使用malloc
或new
在堆上分配的任何內存將一直存在,直到手動釋放,使用free
或delete
。所以是的。
是的。代碼示例中的矢量與您的問題完全無關。重要的是new
關鍵字。您分配的對象new
保留在內存中,直到1)您delete
指針或2)您的程序結束並且操作系統回收您的內存。如果你的向量超出範圍,所有的指針消失,它們指向的對象仍然存在,現在泄漏。
每個new
應該有一個相應的delete
或者你應該把你得到的指針,爲你照顧(如shared_ptr
)。
是的,您使用new
創建的Dish
類型的未命名對象將繼續存在於該函數之外。
但是,這與您在問題標題中提到的「存在指針」無關。未命名的對象的類型爲Dish
。它不是一個指針。它與您的obj
指針無關。
指針obj
將在函數退出時消失,而用於指向的未命名的Dish
對象將繼續存在。您有責任確保obj
指針的值在obj
消失之前存儲在某處。這樣,您可以繼續保持對使用new
創建的未命名的Dish
對象的評估。
請不要將原始指針存儲在容器中,除非*絕對*無法避免(這種情況極少),它們是維護噩夢和錯誤/泄漏的重要來源。優選存儲普通對象('vector')或至少智能指針('vector >'或'vector '')的容器。作爲我剛纔所說的一個例子:你的兩行代碼('new/push_back')會泄漏內存,因爲它們不是異常安全的。這只是冰山一角。 –
syam
@JapeCorbel我忘了說,好標題:) – feralin