C new 運算子 用法總結

2022-06-14 07:57:10 字數 2905 閱讀 4378

1.分配記憶體初始化標量型別(如 int 或 double),在型別名後加初始值,並用小括號括起,c++11中也支援大括號。

int * pi = new int (6); 

double * pd = new double (9.99);

//c++11中, 支援以下寫法

int * pi = new int ;

double * pd = new double ;

2.初始化結構或陣列,需要使用大括號列表初始化 ,需編譯器支援 c++11

struct where;

where * one = new where ;

int * ar = new int [4] ;

3.使用 delete 釋放 new分配的記憶體 (僅限於常規 new 分配的 堆記憶體)

delete pi;

delete pd;

delete one;

// 釋放陣列 記住 加

delete ar;

4.建立類物件

(1)new建立物件,ptest用來接收物件指標。new申請的物件,則只有呼叫到delete時才會執行析構函式,如果程式退出而沒有執行delete則會造成記憶體洩漏:

ctest*  ptest = new  ctest();  delete ptest;
(2)不用new,直接使用類定義申明,使用完後不需要手動釋放,該類析構函式會自動執行:

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!"《運算子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

#includeusing namespace std;

struct chaff

;char buffer1[50];

char buffer2[200];

int main()

2.使用placement new構造起來的物件或陣列,要顯式呼叫它們的析構函式來銷毀(析構函式並不釋放物件的記憶體),千萬不要使用delete.這是因為placement new構造起來的物件或陣列大小並不一定等於原來分配的記憶體大小,使用delete會造成記憶體洩漏或者之後釋放記憶體時出現執行時錯誤。

3.當使用new運算子定義乙個多維陣列變數或陣列物件時,它產生乙個指向陣列第乙個元素的指標,返回的型別保持了除最左邊維數外的所有維數。

C new用法總結

有一道這樣的題 寫出c 中new關鍵字的三種用法,思前想後挖空心思也只想出了兩種用法,回來查了下msdn,還真是有第三種用法 用於在泛型宣告中約束可能用作型別引數的引數的型別,這是在framework 2.0 中定義泛行時才會使用到的,自己對c 2.0 中的支援還只是 粗通皮毛,怪不得累死so ma...

運算子總結

1,算術運算子 加或正號 減或負號 乘 除,得到的是商 取餘 自增 自減 字串連線符 注意 a 整數相除結果還是整數 b 從左向右依次運算 c 兩個運算元,分為左邊和右邊 左邊小於右邊,結果是左邊 左邊等於右邊,結果為0 左邊大於右邊,結果是餘數 最終的餘數的符號和左邊的運算元一直 d 和 如果單獨...

C new和delete運算子得簡單使用

c 中的new運算子用來分配記憶體,和c語言中得malloc有相似得功能。使用new為當個元素開闢記憶體空間,並返回位址 typename pointer name new typename int a new int 使用new建立動態陣列並返回位址 typename pointer name n...