1.分配內存初始化標量類型(如 int 或 double),在類型名後加初始值,並用小括號括起,C++11中也支持大括號。程序員
int * pi = new int (6); double * pd = new double (9.99); //C++11中, 支持如下寫法 int * pi = new int {6}; double * pd = new double {9.99};
2.初始化結構或數組,須要使用大括號列表初始化 ,需編譯器 支持 C++11。數組
struct where{double x; double y; double z;}; where * one = new where {1.2, 2.2, 3.2}; int * ar = new int [4] {1, 2, 3, 4};
3.使用 delete 釋放 new分配的內存 (僅限於常規 new 分配的 堆內存)函數
delete pi; delete pd; delete one; // 釋放數組 記住 加[] delete [] ar;
4.建立類對象spa
(1)new建立對象,pTest用來接收對象指針。new申請的對象,則只有調用到delete時纔會執行析構函數,若是程序退出而沒有執行delete則會形成內存泄漏:指針
CTest* pTest = new CTest(); delete pTest;
(2)不用new,直接使用類定義申明,使用完後不須要手動釋放,該類析構函數會自動執行:code
CTest mTest;
(3)使用普通方式建立的類對象,在建立之初就已經分配了內存空間。而類指針,若是未通過對象初始化,則不須要delete釋放:對象
CTest* pTest = NULL;
1.常規分配內存,調用構造函數。分配失敗時,拋出異常。定義以下:內存
void* operator new(std::size_t) throw(std::bad_alloc);編譯器
void operator delete(void *) throw();編譯
分配失敗則拋出異常std::bad_alloc,不是返回NULL,因此判斷返回值是否爲NULL是沒用的。
char *p=new char[size]; //分配失敗,不是返回NULL delete [] p;
2.不拋出異常。分配失敗時,返回NULL。定義以下:
void* operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
char *p=new(nothrow) char[size]; //分配失敗,是返回NULL if(NULL==p) cout<<"alloc failure!"<<endl;
運算符new 和 new [] 分別調用以下函數:
void * operator new(std::size_t); //use by new void * operator new [] (std::size_t); //use by new []
運算符delete 和 delete [] 分別調用以下函數:
void * operator delete(void *); //use by delete void * operator delete [](void *); //use by delete []
這些函數稱爲 分配函數 ,位於全局名稱空間中。std::size_t 是一個 typedef。
例:
int * pi = new int; //將轉換爲下面這樣 int * pi = new (sizeof(int)); int * pi = new int[40]; //將轉換爲下面這樣 int * pi = new (40 * sizeof(int)); //一樣的 delete pi; //將轉換爲下面這樣 delete (pi);
一般,new負責在 堆 中分配一個足以知足要求的內存塊,但 定位new可讓程序員指定要使用的內存位置。不會內存分配失敗,由於它根本不分配內存,只調用對象的構造函數。它容許在一塊已經分配成功的內存上從新構造對象或對象數組。定義以下:
void* operator new(size_t,void*);
void operator delete(void,void);
1.使用 定位new運算符,首先要包含 頭文件 new
#include<new> using namespace std; struct chaff { char dross[20]; int slag; }; char buffer1[50]; char buffer2[200]; int main() { chaff * p1, p2; p2 = new (buffer1) chaff; // 在buffer1中 p2 = new (buffer2) int[20]; // 在buffer2中 }
2.使用placement new構造起來的對象或數組,要顯式調用它們的析構函數來銷燬(析構函數並不釋放對象的內存),千萬不要使用delete.這是由於placement new構造起來的對象或數組大小並不必定等於原來分配的內存大小,使用delete會形成內存泄漏或者以後釋放內存時出現運行時錯誤。
3.當使用new運算符定義一個多維數組變量或數組對象時,它產生一個指向數組第一個元素的指針,返回的類型保持了除最左邊維數外的全部維數。