首先new與delete成對出現,自己的代碼中需要對自己new出來的東西負責。 一般來說,new一個對象的話delete它就好了,但是new[]的話需要使用delete[],實際上,對于基本類型,new[]之后delete與delete[]差別不大,但是對于對象,由于對象析構函數的存在,delete將只會調用數組第一項的析構函數,而delete[]則會挨著調用它們的析構函數,所以對于數組應該使用delete[]回收內存。 代碼:
class A{public: A(){cout<<"constructor"<<endl;} ~A(){cout<<"destructor"<<endl;}};int main(){ auto a=new A[3]; delete a; a=0; cout<<endl; auto b=new A[3]; delete []b; b=0; getchar(); return 0;}__結果: 
小結 - 1、delete[]挨個調用了析構函數進行處理,如果類的析構函數中存在一些釋放、清除操作的話,錯用delete處理new[]就會出現問題甚至內存泄漏 - 2、free與malloc成對出現,與new和delete的區別主要是new會生成空間,并且會調用構造函數,delete調用析構函數并釋放空間,而malloc、free只是申請、釋放空間而已 - 3、free和delete之后都需要將指針置0,以防止再次訪問或者再次清除空間,這很可能會導致程序崩潰和不可預期的結果,很可能會出現很難追蹤的bug,而實際上free(0)和delete 0都是合法且不會出問題的 對于如下代碼:
auto c=(int*)malloc(sizeof(int)); if(c!=NULL) { free(c); c=0; }由于free(0)是合法并且不會出問題的,所以判斷指針合法性也不是必須的,可寫為:
auto c=(int*)malloc(sizeof(int)); free(c); c=0;
|
新聞熱點
疑難解答