分配乙個新變數的時候,編譯器/系統為什麼不會把該記憶體區域的資料清零
為什麼未初始化的指標/變數會指向乙個隨機值(不確定值),而不是null
為什麼delete、free不會將使用的記憶體清零,然後再釋放、把指標置null
記憶體中殘留的資料還有意義嗎?這點會被黑客利用嗎?
為了效率,所以編譯器/系統不做這些不必要的操作?
1、全域性變數中的指標預設指向0,棧中的指標預設指向0xcccccccc,堆中的指標預設指向0xcdcdcdcd。對於在windows下的c語言寫出的控制台程式和窗體程式,全域性變數和區域性static變數都是放在全域性區域,這部分區域預設是0,至於為什麼是0,我不知道。
2、棧中的指標,也就是在函式函式體內(包括main和其他的入口函式)宣告的指標,預設值是0xcccccccc,在看彙編的時候可以發現,在函式呼叫過程中,引數入棧,調整棧幀後,編譯器會生成一段額外的**用來初始化呼叫棧,也就是把這些地方的資料全部改為0xcccccccc(0xcc的組合語言是int3,中止的意思,相當於插入斷點)。
3、堆區的資料預設是0xcd(堆區可以分配的地方預設是0xcd,關於堆我了解的不多,有誤請指出),但是在堆中的指標我還沒有見過,int*p=new int這種方法定義的指標p在棧中,它ta指向堆中的乙個地方。
4、delete和free只是把堆中的這塊區域標記為空閒。標記空閒只需要把該區域加入到堆的空閒鍊錶中就可以了。如果要置0,效率會低。
5、記憶體中殘留資料一般出現在堆中,這些資料應該很難被黑了利用吧,第一,這些資料在龐大的堆中,由於已經洩露,所以找到他們很難,其次,就算找到了這些資料的位置,但你不知道這些16進製制數代表什麼?字元?數字?還是其他。不過不排除一些黑客真的去找到了這些資料然後進行分析。比如你把你的銀行卡密碼存了起來然後只是簡單的把ta delete掉, int* key=new int,*key=123456,delete key,這樣的話123456還在堆中,還是可以找到的(就像大海撈針,只是不太容易
未初始化的指標
1.我們定義了乙個指標,一定要初始化,比如 int a,沒有初始化時,a的指向是不明確的。若它指向非法位址,這時的操作會報異常 若它指向乙個合法位址,這是非常危險的,因為這樣可能更改乙個正在使用的數值。若在mcu中,指標指向非法位址,程式會跑飛。2.關於null指標,有時我們會寫乙個函式,這個函式返...
初始化乙個指標的方法
方法1.在用到指標的地方.cpp中 cinfo pinfo pinfo cinfo createinfo 中是類cinfo的定義 ifndef info h define info h include using namespace std class cinfo endif 類cinfo的.cpp...
未初始化和非法的指標
下面這個 說明了乙個極為常見的錯誤 int a a 12 警告 究竟a應該指向 我們宣告了這個變數,但從未對它進行初始化,所以我們沒有辦法 12這個值儲存於什麼地方。從這一點看,指標變數和其他變數並無區別,如果變數是靜態的,它會被初始化為0.但如果變數是自動的,它根本不會被初始化。無論哪種情況,宣告...