簡體   English   中英

如果我不釋放/刪除動態分配的數組會發生什么?

[英]What happens if i don't free/delete dynamically allocated arrays?

這段代碼不是我寫的! 在類WebServer中,我們重載+ =運算符。 該類使用動態分配的WebPage類型的對象數組(另一個類,組合)定義為WebPage * wp;

WebServer & operator +=( WebPage webPage ) {
WebPage * tmp = new WebPage [ count + 1];
for (int i = 0; i < count ; i ++)
tmp [i] = wp[i];
tmp [ count ++] = webPage ;
delete [] wp;
wp = tmp;
return * this ;
}

因此,我們為一個對象創建一個具有額外空間的動態分配的WebPages的新數組,然后我們為它們分配wp所持有的值,然后為我們想要添加到數組的對象。 所以如果我刪除delete[] wp; 該程序仍然可以正常工作。 那么如果我刪除那行代碼會發生什么? 而且wp = tmp,這是什么意思,wp只是動態的新名稱,所以它適合類中的名稱,但內存中的位置仍然相同? 要么?

所以如果我刪除delete [] wp; 該程序仍然可以正常工作。 那么如果我刪除那行代碼會發生什么?

你引入了內存泄漏 每次調用此運算符時,該進程都會浪費其地址空間的一部分,直到它最終耗盡內存。

而且wp=tmp ,這是什么意思,wp只是動態的新名稱,所以它適合類中的名稱,但內存中的位置仍然相同? 要么?

wp可能是WebServer的成員(實例變量),它包含它所服務的WebPage對象的實例。 因此,該行正在用新值替換以前的網頁數組(包括剛剛添加到服務器的網頁)。

據推測, WebServer其他成員函數可以讀取wp的值並使用它們執行操作。

總的來說,你應該知道這段代碼編寫得非常糟糕,因為它甚至不是遠程異常安全的,它可以通過一個相當聰明的實現來避免工作,最重要的是它使用的是自制代碼而不是標准語言像std::vector這樣的設施。

你得到:

\n
  • 只是內存泄漏或
  • 具有未定義行為的內存泄漏,具體取決於類的析構函數是否具有帶副作用的代碼。

在這種情況下,它只會導致內存泄漏。 但是,根據是否為其他對象重用相同的未分配內存,可能會導致未定義的行為。

C ++ 11標准:[basic.life](3.8對象生命周期),第4段:

程序可以通過重用對象占用的存儲來結束任何對象的生命周期,或者通過使用非平凡的析構函數顯式調用類類型的對象的析構函數來結束任何對象的生命周期。 對於具有非平凡析構函數的類類型的對象,程序不需要在重用或釋放對象占用的存儲之前顯式調用析構函數; 但是, 如果沒有對析構函數的顯式調用或者如果沒有使用delete-expression(5.3.5)來釋放存儲,則不應該隱式調用析構函數,並且任何依賴於析構函數生成的副作用的程序有未完成的行為。

不調用delete意味着不會調用free並且不會調用析構函數。 不在分配的內存上調用free的含義是內存泄漏 - 您的程序不再可以使用該內存。 如果這種情況持續存在,隨着時間的推移你的程序很可能崩潰,因為內存不足,不調用dtor的含義意味着你的數組使用的任何其他資源(更多的內存,數據庫連接 )也會丟失。

如果您不刪除某些內容,則會出現內存泄漏。 內存泄漏是在“它保持工作很長一段時間,但后來失敗”類別的破壞代​​碼。 這使得它們難以處理,因為問題在原始錯誤發生很長時間后發生,並且通常很難確定內存泄漏的位置/方式,並且當沒有更多內存時應用程序在某個“隨機”位置失敗可用。

當應用程序泄漏內存時,對於其他應用程序也是不好的,因為其他應用程序可用的內存較少。

根據泄漏的規模,它可能最終成為導致您的應用程序因可靠性而聲名狼借的事情之一(“它在兩天后崩潰”)或者它可能最終成為您的應用程序的殺手(“Doesn”當我嘗試一些更復雜的用例時,它會工作“)。 或者可能只是經過兩年的連續使用后,應用程序的內存使用量已經增加到64MB到72MB,因為在整個方案中,泄漏是如此微小,你並沒有真正注意到。

但是內存泄漏從來都不是一件好事,而且在很多情況下都是一件非常糟糕的事情。

在堆上分配new對象,直到它們被delete釋放。 如果你不刪除它們,它們將保留在那里(但不會被訪問 - >這稱為內存泄漏),直到你的進程退出,然后操作系統將解除分配它們。

它可能是一個糟糕的代碼,但我不知道使用字符串和向量(idk因為他們沒有教我們的原因),但我仍然不太明白。 是的,用WebPage * tmp = new WebPage [ count + 1]; 我們占用新的空間,然后我們傳輸數據,然后我們刪除wp。 那么什么是wp = tmp; 做。 它是否僅將名稱wp賦予tmp占用的空間,以便它對應於類中的名稱,但這些對象的地址與tmp使用的地址相同,但與刪除前使用的wp不同? 在此輸入圖像描述 就像是:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM