當為字元陣列動態開闢一塊記憶體空間時:
char *ptemp = new char[8192];
如果想要初始化這一塊記憶體,想當然的就寫了如下**:
memset(ptemp,0,strlen(ptemp));
動態開闢的空間用完之後記得釋放:
if(ptemp)
大家能看出這段**有問題麼?
我們通常用乙個char型別的陣列來存放一些列char,並且在末尾放上乙個0,表示結束。
當使用strlen時,由於ptemp指向的那一片連續記憶體空間裡的值是未知的,strlen就會從ptemp指向的記憶體開始往後乙個位元組乙個位元組地讀,直到讀到結束符0,strlen的返回值便是已經讀過的字元個數也就是「字串」的長度了。
但是至於什麼時候讀到結束符0,就不得而知了,記憶體單元裡存放的是什麼就是什麼,因此strlen返回的結果就錯了。所以當你delete ptemp,就會出錯。
解決的方便很簡單,就是你想開闢多大的空間,在memset裡就直接寫上該空間的大小:
memset(ptemp,0,8192);
另外,順便科普下delete和delete
int *p=new int[100];
int num[100];
p=num;
delete p;
錯誤是發生在delete p,為什麼呢?按理說用new申請,用delete釋放,應該沒有問題啊。但是錯誤發生的原因是因為deletep釋放的是陣列num[100]的空間,而我們申請的空間根本就沒有釋放,為什麼會出現這種情況呢?因為此時的指標已指向了num陣列的首位址,而num[100]的空間會由系統自動釋放,而我們現在強行釋放,所以會發生錯誤。
int *p=new int[3];
*p=1;
p++;//p的指向改變了,指向了下一空間
*p=2;
delete p;
錯誤還是發生在deletep,c/c++規定,當刪除乙個指標時,這個指標應指向其首位址,而上面的**中p值已經發生了變化,所以會發生錯誤,如何避免呢?可以備份乙份;如 int * pbak=p;在釋放的時候,用deletepbak即可。
int* p = new int(10);
int *pp=p;
delete p;
delete pp;
我們要知道,p向作業系統申請了10個int型別的空間,而pp只是指向這個空間,作業系統並沒有為其再分配10個int型別的空間,所以當你用deletep釋放這個空間後,再用deletepp釋放就會發生錯誤。其實不管用哪個釋放,只要釋放一次就行了。
int a=100;
int *p=&a;
delete p;
看到了這裡,如果你還不能看出這段**的錯誤,那你前面的白看了,說明你還是沒有真正懂得啊!
錯誤還是發生在delete p,什麼原因?因為p並沒有通過new獲得記憶體空間,只是指向某個變數,而delete p是強行釋放a的空間,肯定發生錯誤啦。
delete 和 delete 區別
我們首先要知道當delete的時候,系統會自動呼叫已分配的物件的析構函式。
那麼當我們用new分配的物件是基本資料型別的時候,用delete和delete沒什麼區別,都可以。但是當用new分配的物件是自定義型別的時候,必須要用delete,這樣它才會呼叫每個物件的析構函式,除非你的析構函式沒有做任何事。
總結一句話:使用 new 得來的空間,用 delete 來釋放;使用 new 得來的空間,必須用 delete 來釋放。這樣肯定不會錯。
當 「HTTP」 先生遇上「S」小姐
情人節的晚上,天空中淅淅瀝瀝的下著帶有些寒意的小雨。http 先生孤零零的坐在咖啡廳中,對著面前的電腦發呆。他有意的遮蔽掉了周邊情侶們的竊竊私語,這對單身的他來說是 也是一陣陣傷害。這時,咖啡廳的門被開啟了,風姿綽約的 s 小姐出現在 http 先生的眼中。當 http 先生遇見 s 小姐,會產生怎...
當C 遇上NPOI匯出Excel
用npoi可以實現excel的匯入與匯出,下面我先介紹將c 的datagrideview中資料匯出到excel功能 將excel匯入datagrideview後續補充。第一步 在你的專案資料夾中可以建立乙個名為lib的資料夾,並將外掛程式檔案放入裡面 第二步 將上圖所有.dll格式的檔案在專案中所需...
MQTT通訊之旅 當A7670C遇上A7670E
小明在深圳,他有乙個a7670c 小紅在巴黎,她有乙個a7670e。小明心想用他的a7670c能否給小紅的a7670e發資訊,想了很久沒有很好的法子,結果一天晚上,做了乙個夢 在mqtt的幫助下 a7670e遇上a7670c,也就有了下文 通訊流程圖 關鍵指令分析 檢查網路 at cping www...