今天突然有幾個疑問
假設在子函數內部new的數組(double *p = new double[5])
- 該數組在子函數外部能不能再用呢?怎麼用呢?
- 子函數結束後數組所在的內存被釋放了麼?
- 如果沒又被釋放,那麼我們如何用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