#include <iostream>
using namespace std;
int main()
{
int* pointer = new int[5];
pointer = new int [10];
delete[] pointer;
return 0;
}
為指標分配新記憶體后,長度為 5 的舊記憶體會發生什么?如果是記憶體泄漏,我應該改用 realloc() 嗎?
uj5u.com熱心網友回復:
我希望你在以下場景中想象自己
- 你站在深淵旁邊,一只手臂被綁在背后。因此,您有一只手可用。那只手是你的
pointer變數。 - 在某個時候,你要求我給你一個球。那個球是通過分配的記憶體
new。 - 我把球扔給你,你用一只空手接住。您并不“擁有”球本身,但這完全是借給您的,并且是您的專屬責任。如果/當你不再需要它時,我相信你會把它扔回去。
- 現在,你要求我給你一個不同的球,一個新的
new,如果你愿意的話。 - 我這樣做了,你接住了新球,但要這樣做,你首先要丟掉舊球(雙關語;是的,你“丟了球”)。它墜入深淵。沒有人知道它最終會在哪里結束。但現在你拿著第二個球。
- 現在是時候歸還我分發給你的球了。你把你還有的扔給我,很好。但是第一個永遠消失了。它不在任何人的手中,也沒有人知道它在哪里。
那是記憶體泄漏。
它可以通過多種方式規避。
- 在你要求新球之前,你可以把球扔給我。
- 你可以打破束縛你另一只手臂的枷鎖,然后抓住它。現在,您的兩只手中有兩個球(例如,兩個指標中的兩個分配),一旦完成它們,您將(希望)有一天將它們扔回給我。
- 您可以使用具有自動魔法超級歸航信標邏輯的大肆宣傳的原型球,因此即使被扔到一邊也不會掉入深淵。相反,它知道如何自己找到回到我身邊的路。(智能指標)。
- 您可以使用一個特殊的球,它知道如何在需要時(在一定程度上)本能地向我要求更大的尺寸。(
std::vector例如一個) - 等等。
是的,你有記憶體泄漏。一個明目張膽的。您可以通過delete[]在要求更多之前回傳記憶體來解決它。您可以通過使用多個指標并同時管理它們來解決它。您可以使用智能指標等智能結構來解決它,以幫助進行生命周期管理。或者你可以做現代 C 程式員所做的事情:使用RAII策略讓代碼和智能容器主要為你管理事情。
關于realloc......只是不要。realloc是用于調整緩沖區大小(甚至在需要時分配它們)的 C 機制。但它對存盤在其中的復雜物體的特征一無所知。未能正確地構造和破壞具有如此復雜性的物件會導致后來參考的災難。
從長遠來看,接受用不同的語言、不同的模式和方法進行編程的概念。C 沒有像std::vector; 你做。C 沒有智能指標;你做。等等。盡早并經常接受這一點。它將在未來多次收回成本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/409916.html
標籤:
上一篇:訪問欄位導致取消參考C中的空指標
