今天面試碰到這個問題了,可以說這個問題是我回答最冤枉的。
我覺得我對這個問題,有很清晰的認識。但是不知道為什麼,嘴禿嘍了一句記憶體洩漏,真想打自己乙個大嘴巴。
記憶體洩漏的情況的產生是:例如:用int* p=(int*)malloc(sizeof(int));讓p重新指向其它,這樣用malloc()開闢的空間就找不到了,造成記憶體洩漏。
乙個指標釋放後不置空的後果:
free(p);後p是乙個非法的指標。不可以訪問它。如果**很長,誤以為p合法,直接訪問,有可能會造成程式崩潰。
不置空的話,在後面無法檢測指標的合法性。我們在平時程式設計時,對空指標很容易檢測(if(null==p)),但是對於非法指標p不為空,我們是無法檢測到的。
防止對乙個已經釋放的指標多次釋放造成程式崩潰,但是對乙個null指標多次釋放是合法的。
所以,我們在free後一定要將指標置空。
防止我們忘記,可以在程式開始用巨集定義乙個函式:
#define safe_free(p) \
if
(p) \
這樣我們就可以使用safe_free防止我們忘記置空。
不置空的危害性是非常大的,所以一定要置空。
乙個關於空指標的思考
最近在看 時發現乙個用於求結構體成員偏移量的方式 define nbb offsetof struct,field nbb buf size nbb byte struct 0 field nbb byte 0 奇怪的是對 struct 0 field的引用怎麼不會出現錯誤呢?於是寫了如下 進行簡單...
C 刪除空指標的乙個坑
最近使用了專案公共庫中看起來很穩定的乙個訊息佇列類 前同事留下的 起初用得還挺好。後來程式中突然出現了記憶體暴漲的情況,最後定位下來是這個類的問題。隨後花了一些時間定位出現問題的 其實在debug時都沒有找到問題 真正找到問題是憑著感覺在一堆 裡揪出了這樣一句話 delete void lparam...
今天解決了乙個空指標
swagger裡傳入請求資料時,老是報nullpointerexception debug時發現會出現這麼一行 cannot find local variable 原因是資料庫表裡後來加了個擴充套件欄位param1,然而在請求報文裡有命名規範為sid,雖然實體類裡改了資料庫的字段,但是請求報文轉換...