delete和delete[ ]、exit和return
阿新 • • 發佈:2019-01-13
delete和delete[ ]
在C++中,申請堆上空間有著兩種方式new和new[ ],new是用來申請單個元素空間,new[ ]是申請存放多個元素的連續空間。
空間申請方式的不同對應著空間釋放的方式也不同,教材上說new和new[ ]分別對應著delete和delete[ ]
#define _CRTDBG_MAP_ALLOC #include<stdlib.h> #include <crtdbg.h> #include<iostream> using namespace std; char* getmem(char *ptr) { ptr = new char[100]; return ptr; } int main() { char *p=nullptr; p=getmem(p); delete p; //delete[]p; _CrtDumpMemoryLeaks(); system("pause"); return 0; }
根據教材上我們會發現申請空間使用的是new[ ],但釋放空間使用delete,空間沒有釋放完全,發生了記憶體洩漏,但在VS2015下進行記憶體洩漏檢測時,卻沒有發現記憶體洩漏問題,對於這個問題來說使用delete和delete[ ]的效果是相同的。
這種情況出現的原因在於,在分配簡單型別記憶體時,記憶體大小已經確定了,系統可以記憶並管理。對於像int/short/char等基本的資料型別,由於不存在解構函式(destructor),所以delete和delete[ ]效果一樣,但如果C++物件陣列就不同了。
對於new[ ]和delete[ ]。為基本資料型別分配和回收空間時,delete和delete[ ]的效果相同,但是對於自定義型別分配和回收空間時,必須new[ ]和delete[ ]匹配起來 。
exit和return
在主函式中,二者作用相同。但當發生呼叫時exit表示程式終止,而return表示返回到呼叫它的位置繼續向下執行。
在多執行緒環境中,當exit被呼叫,表示所有執行緒終止,而return表示呼叫它的執行緒返回到呼叫它的執行緒。
由於水平有限,對於這兩個問題理解暫時只限於此,如有不足之處,懇請指正。