C++ new delete(二)
C++基礎(chǔ)遺漏:new和delete
我記得當(dāng)年學(xué)習(xí)C++基礎(chǔ)的時候,老師曾經(jīng)告訴我們:一般來說new和delete要成對出現(xiàn),在使用完new申請的內(nèi)存后要馬上釋放。我相信持這種說法的人不止我們老師一個人,養(yǎng)成良好的內(nèi)存使用習(xí)慣固然重要,但如果因此就認(rèn)為new和delete必須成對出現(xiàn),使用完new得到的空間后就要馬上用delete釋放的話,就有點(diǎn)“大材小用”了,相信C++提供這一由用戶控制的內(nèi)存控制方法也不是只限于如此的使用方法。
正確靈活的,或許也是“高級”的使用方法,是在A處使用new申請一塊內(nèi)存,用一個指針指pA向它,之后在B處用指針pB指向pA所指向的空間,釋放指針pA本身,接著釋放pB所指向的內(nèi)存空間,最后釋放指針pB本身。
以下的代碼是本過程的一個例子:
#include<iostream.h>
#include<string.h>
char* ReverseString(char* pSourceStr,int nLength)
{
//這里在堆上動態(tài)申請了一個長度為nLength的內(nèi)存空間pDescStr
char* pDescStr=new char[nLength];?
for(int i=0;i<nLength;i++)
{
??? pDescStr[nLength-i-1]=pSourceStr[i];
}
//結(jié)束前并沒有釋放pDescStr所指向的內(nèi)存空間
return pDescStr;
//只是釋放了pDescStr這個指針
}
void main()
{
char pSourceStr[]={"abcdefghijk"};
cout<<"The source string: \t"<<pSourceStr<<endl;
//新建一個指向ReverseString()函數(shù)中申請到的內(nèi)存的指針
char* pDescStr=ReverseString(pSourceStr,strlen(pSourceStr));
cout<<"The desc string: \t"<<pDescStr<<endl;
//在這里釋放ReverseString()函數(shù)中申請到的內(nèi)存
delete[] pDescStr;
//清除pDescStr指針,以免在今后的使用中出現(xiàn)溢出
pDescStr=NULL;
}
從上面的例子可以看出,new和delete并沒有在同一個函數(shù)中出現(xiàn),但是很明顯這樣做沒有造成內(nèi)存泄露(memory leak)。
或許這樣使用new和delete有點(diǎn)小兒科,達(dá)到ReverseString()函數(shù)的目的完全可以不必使用new和delete。我認(rèn)為new和delete最大的用武之地是在線程通信和進(jìn)程通信中:比如線程A要向線程B投遞一條信息,并要求不等線程B做出反應(yīng)線程A就要馬上進(jìn)行后面的操作,也就是要求使用PostMessage(...)函數(shù)來投遞消息,而且發(fā)送的消息內(nèi)容存儲在一個50K或者更大的內(nèi)存空間中,那就必須使用new和delete了,也就是在線程A中用new準(zhǔn)備好這樣一個龐大的消息,之后把指針發(fā)送給進(jìn)程B,進(jìn)程B在處理完消息之后用delete釋放這塊內(nèi)存。
總而言之,new和delete并非我們想像的那么簡單,除了我所提到的用處之外還有不少其他的用處,有待研究。
轉(zhuǎn)載于:https://www.cnblogs.com/yulang314/p/3558428.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的C++ new delete(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 对 mongoDB 分组统计
- 下一篇: spring MVC(2)--注解Hel