c++中new的三種用法具體解析。本站提示廣大學習愛好者:(c++中new的三種用法具體解析)文章只能為提供參考,不一定能成為您想要的結果。以下是c++中new的三種用法具體解析正文
一. 簡介
new有三種應用方法:plain new,nothrow new和placement new。
(1)plain new望文生義就是通俗的new,就是我們慣常應用的new。在C++中是如許界說的:
void* operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void *) throw();
提醒:plain new在分派掉敗的情形下,拋出異常std::bad_alloc而不是前往NULL,是以經由過程斷定前往值能否為NULL是白費的。
(2)nothrow new是不拋出異常的運算符new的情勢。nothrow new在掉敗時,前往NULL。界說以下:
void * operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
(3)placement new意即“放置”,這類new許可在一塊曾經分派勝利的內存上從新結構對象或對象數組。placement new不消擔憂內存分派掉敗,由於它基本不分派內存,它做的獨一一件工作就是挪用對象的結構函數。界說以下:
void* operator new(size_t,void*);
void operator delete(void*,void*);
提醒1:palcement new的重要用處就是重復應用一塊較年夜的靜態分派的內存來結構分歧類型的對象或許他們的數組。
提醒2:placement new結構起來的對象或其數組,要顯示的挪用他們的析構函數來燒毀,萬萬不要應用delete。
char* p = new(nothrow) char[100];
long *q1 = new(p) long(100);
int *q2 = new(p) int[100/sizeof(int)];
二.實例
1.plain new/delete.通俗的new
界說以下:
void *operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void*) throw();
注:尺度C++ plain new掉敗後拋出尺度異常std::bad_alloc而非前往NULL,是以檢討前往值能否為NULL斷定分派能否勝利是白費的。
測試法式:
#include "stdafx.h"
#include <iostream>
using namespace std;
char *GetMemory(unsigned long size)
{
char *p=new char[size];//分派掉敗,不是前往NULL
return p;
}
int main()
{
try
{
char *p=GetMemory(10e11);// 分派掉敗拋出異常std::bad_alloc
//...........
if(!p)//白費
cout<<"failure"<<endl;
delete [] p;
}
catch(const std::bad_alloc &ex)
{
cout<<ex.what()<<endl;
}
return 0;
}
2.nothrow new/delete不拋出異常的運算符new的情勢,new掉敗時前往NULL。
界說以下:
void *operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
struct nothrow_t{}; const nothrow_t nothrow;//nothrow作為new的標記性啞元
測試法式:
#include "stdafx.h"
#include <iostream>
#include <new>
using namespace std;
char *GetMemory(unsigned long size)
{
char *p=new(nothrow) char[size];//分派掉敗,是前往NULL
if(NULL==p)
cout<<"alloc failure!"<<endl;
return p;
}
int main()
{
try
{
char *p=GetMemory(10e11);
//...........
if(p==NULL)
cout<<"failure"<<endl;
delete [] p;
}
catch(const std::bad_alloc &ex)
{
cout<<ex.what()<<endl;
}
return 0;
}
3.placement new/delete 重要用處是:重復應用一塊較年夜的靜態分派勝利的內存來結構分歧類型的對象或許它們的數組。例如可以先請求一個足夠年夜的字符數組,然後當須要時在它下面結構分歧類型的對象或數組。placement new不消擔憂內存分派掉敗,由於它基本不分派內存,它只是挪用對象的結構函數。
測試法式:
#include "stdafx.h"
#include <iostream>
#include <new>
using namespace std;
class ADT
{
int i;
int j;
public:
ADT()
{
}
~ADT()
{
}
};
int main()
{
char *p=new(nothrow) char[sizeof(ADT)+2];
if(p==NULL)
cout<<"failure"<<endl;
ADT *q=new(p) ADT; //placement new:不用擔憂掉敗
// delete q;//毛病!不克不及在此處挪用delete q;
q->ADT::~ADT();//顯示挪用析構函數
delete []p;
return 0;
}
注:應用placement new結構起來的對象或數組,要顯式挪用它們的析構函數來燒毀(析構函數其實不釋放對象的內存),萬萬不要應用delete.這是由於placement new結構起來的對象或數組年夜小其實不必定等於本來分派的內存年夜小,應用delete會形成內存洩露或許以後釋放內存時湧現運轉時毛病。