亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

c++中new的三種用法詳細解析

2020-01-26 15:50:41
字體:
來源:轉載
供稿:網友

一. 簡介
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會造成內存泄漏或者之后釋放內存時出現運行時錯誤。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频在线看| 91精品国产成人| 日本精品一区二区三区在线| 91成品人片a无限观看| 亚洲色图av在线| 国产精品一二三在线| 久久久久久一区二区三区| 欧美日韩一区二区精品| 国产成人免费91av在线| 国产精品一二区| 97在线视频免费观看| 久久久久久久999精品视频| 91精品久久久久久久久久久久久| 久久人人爽人人爽人人片av高请| 日韩精品中文字幕有码专区| 尤物tv国产一区| 国产亚洲精品91在线| 国产精品老牛影院在线观看| 视频在线观看一区二区| 国产精品久久久久久久久粉嫩av| 国产日韩欧美夫妻视频在线观看| 日韩专区在线观看| 91亚洲国产精品| 欧美视频在线观看 亚洲欧| 日韩国产欧美区| 久久久精品免费视频| 少妇久久久久久| 91精品国产一区| 亚洲一区999| 亚洲精品乱码久久久久久按摩观| 欧美激情xxxx性bbbb| 97视频在线播放| 国产精品美女www爽爽爽视频| 91高清视频在线免费观看| 另类专区欧美制服同性| 九色精品免费永久在线| 亚洲乱码一区av黑人高潮| 中文字幕久热精品在线视频| 精品无人国产偷自产在线| 精品国产一区二区三区久久久| 国产精品一区二区三区成人| 色噜噜狠狠色综合网图区| 午夜精品在线视频| 亚洲美女自拍视频| 日韩av一区二区在线| 久久免费国产精品1| 国产亚洲美女精品久久久| 97久久久久久| 成人免费看黄网站| 欧美黑人巨大精品一区二区| yellow中文字幕久久| 欧美中文字幕第一页| 欧美在线国产精品| 日本高清+成人网在线观看| 国产一区二区三区在线免费观看| 国产999视频| 久久色免费在线视频| 狠狠色狠色综合曰曰| 日本精品免费观看| 亚洲精品永久免费精品| 岛国视频午夜一区免费在线观看| 精品高清一区二区三区| 一本一本久久a久久精品综合小说| 精品免费在线视频| 成人精品在线视频| 国产97在线观看| 亚洲r级在线观看| 久久黄色av网站| 国产亚洲欧美日韩一区二区| 精品动漫一区二区| 久久视频在线播放| 日韩亚洲一区二区| 午夜精品一区二区三区在线| 国产精品综合久久久| 久久久精品国产| 欧洲精品毛片网站| 91亚洲国产精品| 亚洲精品久久久久| 欧洲亚洲免费在线| 欧美激情一二三| 在线观看国产精品日韩av| 精品欧美aⅴ在线网站| 97超碰国产精品女人人人爽| 91精品国产乱码久久久久久蜜臀| 国产精品www网站| 欧美国产高跟鞋裸体秀xxxhd| 北条麻妃久久精品| 国产精品一二三视频| 日韩精品在线免费| 91精品国产综合久久久久久蜜臀| 日韩精品一区二区三区第95| 久久亚洲精品一区| 精品成人在线视频| 成人夜晚看av| 亚洲成人久久久| 欧美华人在线视频| 日韩视频第一页| 久久久久久久亚洲精品| 国产成人精品亚洲精品| 欧美富婆性猛交| 97av视频在线| 日韩女在线观看| 伊人久久久久久久久久久久久| 国产精品www网站| 最近中文字幕2019免费| 欧美性生活大片免费观看网址| 亚洲欧美国产精品| 久久人人爽亚洲精品天堂| 日韩av不卡电影| 亚洲欧美成人精品| 欧美精品一区三区| 亚洲国产精品成人一区二区| 久久精品视频99| 色综合色综合网色综合| 久久久久这里只有精品| 日韩欧美国产一区二区| 亚洲欧美中文日韩在线v日本| 欧美视频专区一二在线观看| 久久久噜噜噜久久久| 亚洲欧洲一区二区三区久久| 国产情人节一区| 人九九综合九九宗合| 日韩精品免费综合视频在线播放| 日本乱人伦a精品| 日韩在线观看你懂的| 九九热最新视频//这里只有精品| 97精品国产91久久久久久| 亚洲毛片在线看| 亚洲小视频在线观看| 国产精品高潮粉嫩av| 国产日韩欧美视频| 久久夜色精品亚洲噜噜国产mv| 麻豆国产va免费精品高清在线| 国产精品福利片| 日韩免费在线免费观看| 亚洲福利视频网站| 色狠狠av一区二区三区香蕉蜜桃| 欧美美女15p| 欧美亚洲另类制服自拍| 成人国产精品久久久久久亚洲| 欧美一级黄色网| 亚洲天堂色网站| 日本成人免费在线| 日韩经典第一页| 深夜福利91大全| 黑人巨大精品欧美一区二区三区| 92看片淫黄大片欧美看国产片| 国产一区二区日韩精品欧美精品| 久久综合久中文字幕青草| 国产99久久精品一区二区| 久久影院模特热| 精品久久久久久久久国产字幕| 久久久999精品视频| 国产亚洲激情在线| 亚洲成人激情在线观看| 8x海外华人永久免费日韩内陆视频| 国产精品久久久久91| 91精品国产综合久久香蕉922| 性色av一区二区三区红粉影视| 4438全国成人免费| 日韩av在线影视| 精品久久香蕉国产线看观看gif| 中文字幕欧美视频在线| 国产大片精品免费永久看nba|