C++ new與delete使用的位置,以及判斷內存是否泄露的簡單方式

今天突然有幾個疑問

假設在子函數內部new的數組(double *p = new double[5])

  1. 該數組在子函數外部能不能再用呢?怎麼用呢?
  2. 子函數結束後數組所在的內存被釋放了麼?
  3. 如果沒又被釋放,那麼我們如何用delete釋放呢?(不釋放會導致內存泄漏)

首先看第一個問題

     很明顯,指針 p 隨着子函數退出後,就不存在了。

     那麼,如何去找到數組所在的內存呢?很簡單,在new數組時,將地址保存在全局變量中。

     程序如下

double * GP;
void testFunction(void)
{
     double * pp = new double[5];//使用new開闢內存
     GP = pp;                    //保存地址到全局指針中
     for(int i=0;i<5;i++)        //給數組賦值
     {
        *(pp+i) =  5;
     }
}

int _tmain(int argc, _TCHAR* argv[])
{
    testFunction();
    cout<<*(GP);   
    getchar();
    return 0;  
}

    控制檯輸出 5   

    此時第一個和第二個問題都明確了。在子函數外也可以使用該數組,內存也沒有被釋放。記錄地址的方法也可以用來判斷內存是否被正確釋放(也就是內存是否泄漏)。如果某段內存已經被釋放,那麼你再去讀它,內存裏面顯示的都是1。

第三個問題,如果不去釋放,則會導致內存泄漏。那麼怎麼去delete呢?

    通常我們會想到用 delete [] p;但是p已經不存在了。。。

    很簡單,我們使用 delete [] 保存的內存指針;

    就可以了。

    我們用程序驗證一下

double *GP,*GP1;
void testFunction(void)
{
     double * pp = new double[5];//使用new開闢內存
	 GP = pp;					 //保存地址到全局指針中
	 GP1 = pp;
	 for(int i=0;i<5;i++)        //給數組賦值
	 {
		*(pp+i) =  5;
	 }
}

int _tmain(int argc, _TCHAR* argv[])
{
	testFunction();
	delete [] GP;
	cout<<*(GP1);   
	getchar();
    return 0;  
}

    此時,我們同時用兩個全局指針記錄下地址,一個用來釋放內存,另一個去讀取內存

    控制檯輸出-2.65698e+303,說明內存已經被成功釋放。

    當然我們在編程中總不能總用全局指針吧,此時只要在子函數中返回指針就行。

    程序如下

double *GP;
double * testFunction(void)
{
     double * pp = new double[5];//使用new開闢內存
	 GP = pp;					 //保存地址到全局指針中
	 for(int i=0;i<5;i++)        //給數組賦值
	 {
		*(pp+i) =  5;
	 }
	 return pp;
}

int _tmain(int argc, _TCHAR* argv[])
{
	double * op = testFunction();
	delete [] op;
	cout<<*(GP);   
	getchar();
    return 0;  
} 

此時的GP是用來驗證內存是否被釋放,結果顯示已經被釋放了。

總結

我們在程序任何位置new對象都可以,只是要記住對象指針就行,最後別忘了delete

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章