關於new delete的說明

一、 刪除空指針不會有問題,由於C++的標準規定在delete時首先會判斷指針是否爲空,爲空就再也不處理,因此也就不會有問題。數組

二、 delete一個非空指針以後,並不會將該指針自動置爲空。此時若是重複刪除或繼續訪問會出現問題。安全

三、 從上面的兩個特性,咱們在delete完一個指針以後,要立刻將其置爲空,防止重複delete出現問題。函數

四、 咱們在delete一個指針以前不須要檢測指針是否爲空,由於delete空指針也是沒問題的。spa

五、 咱們在引用一個未知的指針時,要判斷一下這個指針是否爲空。指針

六、 delete和delete[]都會釋放掉其所指向的數組元素內的全部空間,可是delete[]會對每一個對象都調用析構函數,delete只會調用第一個元素的析構函數。對基本類型由於沒有析構函數因此delete和delete[]沒什麼關係。其實若是類中沒有利用new分配空間,在析構函數中不須要delete別的資源的話也是不會內存泄露的,但若是析構函數中須要delete別的資源而這個用delete而不用delete[]就只釋放了第一個元素的資源,剩下元素的其餘資源並不會被釋放。對象

七、 有了malloc/free爲何還要new/delete ?內存

1):malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們均可用於申請動態內存和釋放內存。
2):對於非內部數據類型的對象而言,光用maloc/free沒法知足動態對象的要求。對象在建立的同時要自動執行構造函數,對象在消亡以前要自動執行析構函數。因爲malloc/free是庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函數和析構函數的任務強加於malloc/free。
3):所以C++語言須要一個能完成動態內存分配和初始化工做的運算符new,以及一個能完成清理與釋放內存工做的運算符delete。注意new/delete不是庫函數。這是由於new內置了sizeof、類型轉換和類型安全檢查功能。對於非內部數據類型的對象而言,new在建立動態對象的同時完成了初始化工做,這裏編譯器調用的是對象的無參構造函數。資源

相關文章
相關標籤/搜索