- 對內存的釋放本質是什么?
-
對內存的釋放是不是清零?在vc、vs的情況下都是c這種的嗎?那為什么多次釋放同一塊內存會報錯呢,而且是程序崩潰,想不通,不就是清個零嘛
解決方案
不是清零,而是將這塊內存標記為未使用,之所以不清零,是出於性能的考慮。計算機上到處有類似的設計,比如說,你刪除一個文件,並不是真的將刪除的文件填充0,而也是把對應的簇標記為未分配。格式化硬盤也是如此。這也是為什么刪除了文件只要沒有寫入新的文件你還能將它找回來的原因。
重復釋放內存報錯的原因是因為這些內存已經標記為未分配,就不再有記錄了,所以再次釋放標准庫就會丟出異常。
解決方案二:
1、內存是一個由連續地址,引導的存貯器。數據存入內存,需要依據存入的數據大小,開辟一個區域,用於存貯。並且將區域,標識為已存入數據。這樣,一是通過標識,可以讀取數據,二是不被其它數據覆蓋。
2、當內存需要清零時,操作上不是清零,而是取消這塊內存保存數據的標記。這樣,這塊內在,又可以被使用了。
3、數據不清零,是因為沒有必要。當其它數據存入時,原來數據可以被新的數據覆蓋。
4、重復釋放內存,也就是對該塊內在,再將取消標識。此時,代碼發現此內存已經取消標識,發出報錯信息。提醒用戶。
5、在內存的操作上,是一項很危險的操作,是具有造成危害安全的操作,特別是你定義的內存塊越界,輕則本程序崩潰,重則造成操作操作系統死機。
解決方案三:
多次釋放會報錯原因就是你釋放的是一個對象或者一個變量,第一次釋放之后,他就已經被標記為空或者無了,當你再次釋放的時候會出現找不到要釋放對象的錯誤。
如果沒有這個限制什么時候釋放空間都可以的話,當你釋放了之前所占用的空間,然后有別的程序占用了它,你再次釋放這個地方的時候就會造成別的程序的崩潰。
解決方案四:
應該是一種控制權的釋放(轉移,比如分給你的地,使用權歸你,你不種了要給村委會說一下,人家就給你注銷掉了,也就是把這塊地標為沒有人使用,從而可以再分配給其他人使用)
解決方案五:
不能理解為清零哦。“對內存的釋放”這種表達也容易讓人混淆,應該理解為內存回收再利用,是內存管理的概念。如果一個程序運行中只申請內存而不把內存還給系統,再多的內存也會被吃光的。
而像JAVA這種語言,因為內置了垃圾機制,不用程序員主動釋放內存引用,到一定條件后就會由機制進行清理。C++則不同了,如果是通過 NEW、MALLOC分配的動態內存,就需要程序自己進行清理,而且不能重復清理。
解決方案六:
是標記這塊內存不在需要使用 系統回首 而且一般可能會為0 但是很多指針訪問空的時候會異常
轉載自 https://blog.csdn.net/imJaron/article/details/79927198