使用delete釋放記憶體後 使用用乙個指標 幹嗎還要講該指標清零?

2025-03-28 02:35:20 字數 5405 閱讀 5107

1樓:匿名使用者

因為指標必須要有乙個值。。哪怕是0,釋放記憶體是指釋放記憶體裡面的資料。。而指標是乙個位址。。

就像門牌。。你把談帆肆含轎房子拆了,但門牌還在。。但c++是不允許這樣的。。

重。。這叫迷途指標。。轎畝如果隨後你在沒有重新賦值的情況下使用該指標,後果將是不可預料的:

程式崩潰算你走運。。。所以最好還是引用吧。

2樓:匿名使用者

#includeusing namespace std;int main()樓主每次執行上面的程式,第十一行語句都會顯示不同值,此時指標p已經(delete)釋放了我們把p置0 是來標記 該指標已釋放了,可以避免再次錯誤使用它,避免使用這樣值不確定的「野指標」!很dangerous(危險)哦!順便說一句型肆,可以 用在使用該指標p時 檢查一下:

if (p)如果指標被卜敗轎釋放且置為0,那麼上面的運算結果是為false,不執行改if語句塊。

3樓:匿名使用者

嫌疑是嫌疑。

但這是乙個程式設計的好 習慣。!!

乙個有程式設計好習慣的人。 往往在 使用完 指標型別變數後, 將他的物件清0

這樣者肢不管在什麼時候, 軟體比較襲嫌橋嚴謹。!!這樣更能說明乙個人細心。無論在什麼時拍猛候 都會這樣做。

4樓:匿名使用者

疑問正確,確實有畫蛇添足的嫌疑。

為什麼free函式釋放掉動態記憶體後,不把指標置null,而造成沒什麼用的野指標?

5樓:網友

函式原型是void free(void *p);此處p是形參,修改形參是修改不了引數本身的;如果函式原型是void free(void **p),那就可以在free函式里修改p對應的引數了。所以這是函式自身定義問題,你也可以重寫此函式,使用void free(void **p);然後在函式里將p設定為null。

6樓:網友

free前。

指標指向了乙個記憶體空間,這是合法記憶體,利用指標可以正常訪問該空間free後,指標指向的這段空間被釋放了,這段記憶體搖身成為不可用的」垃圾「記憶體但是指標本身還存在,並且值也沒變。

還是指向了這段空間。

這段free前可用free後成為垃圾記憶體的記憶體free後屬於指向非法記憶體塊。

這就是野指標。

為什麼在呼叫 free() 之後指標沒有變空?使用 (賦值, 比較) 釋放之後的指標有多麼不安全?

7樓:千鋒教育

當呼叫 free() 的時候, 傳入指標指向的記憶體被釋放, 但呼叫函式的指標值可能保持不變, 因為 c 的按值傳參語義意味著被調函式永遠不會永久改變引數的值。

嚴格的講, 被釋放的指標值是無效的, 對它的任何使用, 即使沒有解參照, 也可能帶來問題, 儘管作為一種實現質量的表現, 多數實現都不會對無傷大雅的無效指標使用產生例外。

使用delete釋放記憶體後 使用用乙個指標 幹嗎還要將該指標清零?

8樓:定蕾丁琴

支援上面。已經說得很清楚了,delete只是告訴系統「這個記憶體我不再使用了」。但是你的程式不一定這第認為,你和程式不會知道這個指標已經被系統收回,只是它的作用域對於程式來說一樣是可訪問的。

但是這個指標已經是未知了。

所以在使用指標前應該判斷是否是空指標,釋放以後把指標設為空是最好的。

使用delete釋放記憶體後 使用用乙個指標 幹嗎還要將該指標清零?

9樓:匿名使用者

把指標清0是個好習慣,因為你delete後,原本那塊記憶體的資料已經讓你釋放了,記憶體重新收回。但此時的指標變數依然指向那塊記憶體,在以後的**中若不小心繼續呼叫指標變數,會出現不可預料的錯誤。 建議你 搜尋下 野指標 這個概念!!

delete釋放記憶體

10樓:網友

p=null; 之後,就變成 delete 空指標了,只是 delete 的容錯機制允許傳入乙個空指標而已,不代表沒有問題。

問題的關鍵在於你的賦值語句錯了。

char *p=new char[4]; // p 是乙個指向4個字元的指標。

p="as"; // 注意這裡,"as" 是乙個靜態字串指標這個賦值語句,是把 "as" 的指標位址,賦給 p。

delete p; 就變成了釋放 "as" 這個靜態字串指標,當然會出錯。

應該用字串複製函式:

strcpy(p, "as");

或者更安全的:

#include

stringcbcopya(p, 4, "as");

11樓:網友

你釋放記憶體錯了,執行你那個賦值語句後,p指向字串"as",而不是指向你new出來的空間了,所以你釋放記憶體就會出錯!

12樓:網友

p="as";

這時候p指的位址不再是堆上的了,是常量區。delete只能釋放堆上的記憶體。

delete指標是按什麼為單位釋放記憶體?

13樓:網友

我不是專家。

你考慮一下我的乙個想法,其實我們在使用delete刪除指標的時候,僅僅就是講指標刪除了而已,而之前存放在這個指標指向的位址中的東西並沒有被刪除,由於指標已經不見了,所以不能在訪問到這塊記憶體,但當我們從新分配記憶體的時候還是有可能重新用到這塊記憶體,此時寫入的內容將會把原先的資料覆蓋掉,是那一部分記憶體重新得到利用。

這就是有些人將電腦的東西再刪除後還能復原的原因,電腦高手能夠找到這部分內容。

現在好像有幾款儲存器是可以將資料完全釋放的,將資料完全銷燬,不可再查的。

14樓:網友

3 更接近一些。

delete 釋放此前用new申請的記憶體,new申請了多少就釋放多少。

delete 時的指標型別與new時不一樣時,不影響記憶體釋放,但會影響到哪個解構函式被呼叫(都是基本型別時不存在這個問題)

兩個指標指向同乙個new開闢的空間,當釋放其中乙個指標後,為什麼另乙個指標還能操作這個空間?

15樓:網友

1,c/c++沒有授權這個概念,c語言(含c++)之所以稱為程式設計師的語言就是說,作為程式設計師的你,許可權是最大的,你可以做任何事情。訪問權的管理是程式設計師的事情,就如同陣列邊界檢查工作同樣是程式設計師的事。

2,new只不過程式向系統申請一塊可用記憶體,而系統會檢索登錄檔(不是windows登錄檔)通過已佔用記憶體計算出一塊未被佔用的且可以容納申請長度的記憶體給程式,並且標記這塊記憶體已佔用,然後返回首位址,這個機制只不過防止記憶體重複分配,避免資料被其他程式覆蓋掉,但是讀寫是開放的。

3,通過指標delete,就是告知系統這個指標指向的位址空間我不要了,而系統做的事情僅僅是刪掉這個註冊記錄,那麼這個位址的空間下次可以再分配了,也就是**了,但是內容不需要清掉,清理掉多此一舉,太浪費cpu時間了,因為下次分配時程式會用資料或者通過初始化覆蓋掉廢棄的資料。

因此當乙個指標釋放後,你的程式的其他指標還是指向原位址,而這塊位址沒被其他程式佔用時,裡面的資料還在,因此用其他指標訪問它還是可以的,但是萬一,在你釋放後,多工系統下,其他程序的執行緒馬上申請了這塊記憶體,那你程式讀出的資料可能變化了,但是寫的話就會干擾主權程式的執行。從而可能會導致系統奔潰。

16樓:因特納雄耐爾一定會實現

讀或許可以,寫是絕逼不行。

你這種情況叫懸掛指標,指向的不是你合法能使用的空間,不出問題完全是巧合,瞎雞兒搞。

打個比方,你向國家申請了乙個男/女朋友,你用完上交了,國家可能要分配給別人了。上交以後,你一次兩次撩搭沒出事,不代表國家或ta新伴侶不會揍你。

17樓:百枯葉

你沒有理解指標和記憶體的關係,你在程式退出的時候應該會遇到堆損壞的告警。

new出來的那個指標在堆上開闢了一塊記憶體,這塊記憶體會被這個指標佔用,其它新new出來的指標不會再利用這塊記憶體,這個時候你用另乙個指標指向它,即兩個指標指向了堆上的同一塊記憶體,這個時候實際上delete就會宣告指標對這塊記憶體的獨佔結束了,這塊記憶體現在可能會被新new出來的指標佔用。

但是,記住!delete只是解除了new出來的指標對它指向記憶體的佔用,而不是刪除指標或者這塊記憶體,delete之後指標仍然存在,仍然指向這一塊記憶體。

你仍然能賦值和讀取,但是在程式退出時,程式解構函式會析構到被放棄佔用的記憶體上面(你賦值的時候動態指標就變成了不安全的靜態指標,之所以不安全是因為系統不會維護這塊記憶體了,這塊記憶體隨時會被其它成員佔用),並且程式不能操作堆記憶體,這會造成堆損壞問題。

18樓:網友

delete只是通知系統釋放記憶體,但記憶體仍然是可以讀寫的,釋放的記憶體允許其他new或者函式呼叫申請使用,你如果在其中進行操作,可能會干擾到申請使用者。

即使沒有申請,有些記憶體你是可以操作的,只是後果不明而已,因此指標使用規則就是,自己申請的,就在自己申請的範圍內使用,系統不會為你判斷是否越界使用的,一切後果自行承擔。

c++ 中delete一指標後,該指標的是什麼?是 null 嗎?

19樓:

delete乙個指標之後,只是**指標指向位置的空間,而指標本身的值不變。你需要手工將其賦值為null。

另外delete null的話不會有任何事情發生。

20樓:網友

不是 delete後就變成懸垂指標 就是沒有用的指標了最好自己將他指向null

如 delete p;

p = 0; // 0 == null

這樣就安全了。

否則會產生不必要的後遺症(在大型程式裡你就會懊惱了,當然這個我也不太懂了)

21樓:網友

這書我看過了 c++沉思錄 c++primer 上面都提到智慧型指標 是這樣的:u_ptr這個類算是**類吧(有時叫它控制代碼類 其實我也不知道為什麼) 因為它有計數 計數的是有多少個物件是u_ptr類**的類(原始的) 每建立或者複製這種型別的物件 實際上在u_ptr中的計數加1(有多少個原始的類型別的物件指向u_ptr) 只有乙個u_ptr指向原始的類(或是別的) 注意:當u_ptr中的計數為0時就是沒有物件對向他 所以執行delete p 而**類本身沒有動態申請堆空間 釋放的只是原始類(u_ptr指向的)申請的空間 我覺得你沒有弄清楚指標p和u_ptr之間的區別。

會的!p成為野指標 如果在訪問p將出錯 因為p指向的記憶體空間以不在 但p還是指向原來的地方啊…

22樓:匿名使用者

c++ 中delete一指標後,該指標為野指標。其值不變,還是指向原來的單元,但若訪問這個單元,結果是無法預料的。

23樓:網友

delete刪除的只是該指標指向的記憶體,該指標變成乙個野指標,需要重置為null。

matlab變數如何釋放,就是變數迴圈使用,如何在一次迴圈完後就釋放這個變數的值

使用clear函式就行了 clear 變數名 每次迴圈前,重新賦值。比如 a 0 matlab中for迴圈i,j迴圈,i迴圈完一次後,初始化變數 這個程式可以實現目的。但有幾個問題 首先,a j,j 10 j s 這個式子為什麼放在內迴圈裡?其次,matlab對矩陣和向量的處理非常高效,應儘量避免用...

記憶體xmp超頻後長期使用會不會影響壽命

理論上超頻肯定會縮短使用壽命,沒準幾天就掛了,也沒準用個十幾年不壞。不是專業超頻記憶體條,最好就不要超了。除非能帶給你看得見的效能提升。跑分除外。理論上,超頻確實會影響硬體壽命的。因為,額定頻率是廠家經過檢測得到的可以長期穩定工作的頻率。超頻,就超越了這個狀態,讓硬體處於超負荷工作狀態了。這對硬體的...

記憶體使用率過高是怎麼回事,記憶體使用率過高是什麼原因引起的?

win7系統加些其他的什麼防毒軟體什麼的沒看什麼差不多1g沒什麼問題,你可以ctrl shift esc看下工作管理員,然後看程序,看你哪些軟體佔用了記憶體,win7 空閒狀態下1g應該沒什麼問題,你可以關閉下win7的特效什麼的可以降低下使用率。感覺正常,這是很多程序已經啟動執行了,甚至到1g 多...