當前位置:編程學習大全網 - 源碼下載 - C++ delete命令的原理是什麽?

C++ delete命令的原理是什麽?

我們編譯出來的程序運行時是和操作系統打交道的,程序中用到的內存都向操作系統申請,在多任務的操作系統下,不允許普通的程序訪問未分配的內存。

操作系統手裏有壹張表,標明內存中的哪些單元被哪個程序占用了,哪些是空閑的(空閑不壹定是空值,我們編寫的程序如果動態變量沒有初始化往往會帶有不定值,就是這個緣故),當程序提出申請,它就把空閑的內存分配給程序。程序運行完後操作系統再把分配給的內存標記為空閑,以供其他程序用。

其實我們完全留意到,向磁盤寫東西的時候很慢,但把寫進了的東西刪掉的時候卻快得多,原因就在於操作系統刪除文件的時候偷懶了,並沒有徹底粉碎文件的每壹個數據,而是在那張文件分配表上將這個文件所在的區域標記為空閑罷了,多數數據仍然在那裏,從而給數據恢復軟件留下了後門。

樓主的程序前面會申請空間來存放類A和B的對象。執行到delete就會去內存的堆區將指定的內存單元交還給操作系統。所以必須和new配套使用,否則會釀成嚴重後果。

我個人的猜測,執行delete只是將它後面變量的地址告訴給操作系統,操作系統把它手裏的那張表給改了,但delete掉的指針沒有變化,還是原來指向的變量的地址值。可以運行壹下這個小程序:

#include <iostream.h>

int main(void)

{

int *p;

p=new int;

cout<<(unsigned int)p<<endl;//1

delete p;

cout<<(unsigned int)p<<endl;//2

p=NULL;

cout<<p;

return 0;

}

可以看到,delete前後,指針p的值沒有變化。但是如果將2處改為cout<<*p;就要出問題了,操作系統會阻止程序去訪問這個地址(表現為訪問沖突,Access Violation),因為這個地址已經用delete歸還給操作系統了。這時候的指針p叫做懸空狀態,也就是野指針,怎麽稱呼都無所謂。它並沒有被銷毀,通過重新取其他變量的地址,還可以繼續訪問*p,但現在不行。

指針實際上是壹個無符號整型變量,幾乎所有我們碰到的指針,在C++下都是4個字節,因為C++在32位機上將int實現得和long int壹樣大小。

那麽為什麽要給指針規定類型呢?我猜測,這壹方面是為了訪問它指向的對象時確定讀取內存單元的長度,比如char型變量占1個字節,int型變量占4個字節,類對象和結構體對象占的長度更加多樣化,當定義了壹個char型指針p,執行*p時程序只讀取壹個字節的內容,如果p是int型則*p讀取4個連續的字節的內容。還有指針相加減,指針自增自減運算,都可以通過這個來確定壹次移動的長度。

另壹方面,也防止亂指發生意外吧,C語言中printf和scanf的格式控制串就要用的時候親自設定,如果設不對運行時就可能出錯。

  • 上一篇:10大編程語言排行?
  • 下一篇:完美時空的完美產品
  • copyright 2024編程學習大全網