1樓:匿名使用者
delete,只是釋放了記憶體的使用宣告,並沒有」重新整理「或者」格式化「記憶體。
a變成了一個無用的地址值,不再和記憶體區塊有鎖定的關聯,之後這塊記憶體可以被其它**所使用。
但你在delete之後直接訪問,因為沒有」重新整理「或者」格式化「記憶體,內容都是不變的。
也因此,經常可以看到程式在delete之後,還加一條語句:a=null;,這樣就是為了更安全,方式**混亂造成的地址誤操作。
2樓:真·雪落無痕
int *a=new int[5]; 為什麼我沒見過這種用法,你是想用a[0] = 6 吧;
用兩個編譯器都通過不了,改成a[0] = 6後,就輸不出6了 。
不過地址還是能輸出的,因為刪除的是堆上的值而不是地址。
3樓:夢幻才子
野指標問題,雖然new的記憶體已經釋放,但這個記憶體中的值仍在,如果程式沒有改變這個記憶體的值,則輸出的時候還是原來初始化的值
4樓:匿名使用者
你釋放的堆記憶體,並不會影響a,因為a只是一個棧上的變數,舉個例子,你腦袋中記著你的電腦密碼,某天一個小偷把你的電腦釋放走了,你腦袋的密碼,雖然沒用了,但是你還是記得。
為什麼還是訪問堆記憶體的內容6,這個取決於編譯器的記憶體管理,很多時候是釋放記憶體之後,編譯器並不會把你以前的值清除,只是在某個標誌位標記一下,表示某塊記憶體沒人用了,並不會主動把以前的值清零,因為這樣浪費時間,下次直接覆蓋即可,而且為了加快分配速度,在符合特定策略時,甚至都不標記,例如linux的記憶體管理的fastbin。所以你這麼簡單的**,能訪問到以前的內容是完全可能的。
不懂追問,懂了採納。
C語言指標動態記憶體分配,C語言中的動態記憶體分配的用法舉例
void malloc size t size 這個函式請求分配大小為size位元組的記憶體,並返回指向該塊記憶體起始位置的指標 它接受的引數型別size t是unsigned int的一個typedef,這種型別用來表示資料型別的大小 如char型別的大小為1 位元組 它返回的是一個void 型別...
靜態記憶體和動態記憶體有什麼區別,那個好一點
浙江特浦科技 我們一般說的記憶體都是動態的.sdr ddr等.在cpu內部的快取都是靜態的.sram.這種記憶體速度快.昂貴.記憶體的物理實質是一組或多組具備資料輸入輸出和資料儲存功能的積體電路。記憶體按儲存資訊的功能可分為只讀儲存器rom read only memory 可改寫的只讀儲存器epr...
關於new和delete的問題,關於new 和 delete 的一個問題??
new的本質是從記憶體的heap區尋找一片空閒的空間然後初始化然後返回。而delete就是把new出來的空間 但是delete怎麼知道該 多少空間呢?顯然,只能是在new的時候提供。因此,a new int 100 的時候,返回到a裡面的最少有兩個資訊 開闢出來的記憶體空間的地址和空間的大小。當b ...