1. 程式人生 > >delete和delete[ ]、exit和return

delete和delete[ ]、exit和return

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表示呼叫它的執行緒返回到呼叫它的執行緒。

由於水平有限,對於這兩個問題理解暫時只限於此,如有不足之處,懇請指正。