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