2014-09-24 28 views
0

我自己被給予的基準變量,像這樣將內存管理函數的引用傳遞給ok函數嗎?

public Draw(sfml::RenderWindow& window) 
{ 
    window.draw(Sprite); 
} 

基本上我通過我RenderWindow的變量作爲參考到我drawObject其具有被稱爲繪圖函數C中的函數++,這需要在RenderWindow的參考並繪製圖像。

功能後已經完成將窗口參考變量被刪除,並且內存將被解除分配或者將參照永遠被製成,隨着越來越多的RenderWindow的引用是由慢慢佔用更多的內存?

+2

_'參考變量'_(即用於傳遞的指針)由棧作爲任何其他參數處理。沒有泄漏。 – 2014-09-24 10:55:20

回答

1

參考參數(或就此而言變量)在C不被計數++。出於實際的目的,引用就像普通的具有不同語法的指針,另外它們總是指向一個有效的值(或者你的程序不合格並且調用未定義的行爲)。而且,引用不能被重新綁定(所以在初始化之後,引用總是指向同一個對象)。因此,與普通指針一樣,引用不會強制對象活得更長(const type&綁定返回的)的顯着例外。就像指針一樣,你必須注意引用所引用的對象在任何時候都仍然活着,引用本身仍然存在。

+0

所以一旦這個函數完成了,引用變量將被從內存中刪除,但是我的renderWindow將保持活着(這是我想要的) – Canvas 2014-09-24 10:57:37

+0

@Canvas引用在內存中絕對沒有任何理由存在。通常可以在不分配內存的情況下實現引用。引用不是對象,所以它們沒有生命週期,所以你不必擔心這個。它們所指的對象是唯一的問題。 – 2014-09-24 10:58:46

+0

令人敬畏的謝謝約瑟夫,我已經讀過關於指針和引用的文章,但發現很難理解它們的內存管理,所以歡呼聲清理那些 – Canvas 2014-09-24 10:59:34

0

全部函數參數,函數返回時是否清除內置類型,結構體,指針或引用。

這包括其中有他們的類型運行析構函數。它沒有做的是在任何指針上調用deletedelete[] - 編譯器不知道這是否合理。例如,printf(const char*, ...)顯然不應該試圖刪除文字"Hello, World"的說法。

所以這基本上是通過函數的參數內存泄漏的唯一方法:使用指針(但不是智能指針),通過一個新的對象,而忘記刪除它的調用者或被調用方。

1

引用不是對象。他們不一定需要任何內存分配。因此他們沒有一輩子讓你擔心。

參考的範圍是您的Draw函數,這意味着您將無法從函數的外部訪問該引用,但除此之外不在此限。

你需要有唯一擔心的是,你的參考是指對象的生命週期。引用無疑引用了一個無效的對象,因爲它引用的對象的生命週期已經結束。

指針,不過,對象。如果您使用了指針,指針會自動存儲持續時間,因爲它只是一個簡單的變量聲明。這意味着指針對象的生命週期將持續到函數結束(與其作用域相同)。所以即使指針是對象,也沒有額外的關注(although pointers in general are usually not the best idea)。

當您開始處理創建具有動態存儲持續時間的對象的newdelete時,分配和取消分配對象變得很複雜。你應該嘗試avoid this as much as possible。請注意,在int* p = new int(5);中,它不是您需要擔心的指針,而是指針指向的int。請注意,動態分配引用是不可能的(因爲它可能沒有任何分配!)。