<em id="0a85b"><option id="0a85b"></option></em>

<abbr id="0a85b"></abbr>

      <nobr id="0a85b"></nobr>
        <tr id="0a85b"></tr>
        9久久伊人精品综合,亚洲一区精品视频在线,成 人免费va视频,国产一区二区三区黄网,99国产精品永久免费视频,亚洲毛片多多影院,精品久久久无码人妻中文字幕,无码国产欧美一区二区三区不卡
        學習啦>學習英語>專業(yè)英語>計算機英語>

        c中new的用法

        時間: 長思709 分享

          下面小編就跟你們詳細介紹下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允許在一塊已經(jīng)分配成功的內(nèi)存上重新構造對象或?qū)ο髷?shù)組。placement new不用擔心內(nèi)存分配失敗,因為它根本不分配內(nèi)存,它做的唯一一件事情就是調(diào)用對象的構造函數(shù)。定義如下:

          void* operator new(size_t,void*);

          void operator delete(void*,void*);

          提示1:palcement new的主要用途就是反復使用一塊較大的動態(tài)分配的內(nèi)存來構造不同類型的對象或者他們的數(shù)組。

          提示2:placement new構造起來的對象或其數(shù)組,要顯示的調(diào)用他們的析構函數(shù)來銷毀,千萬不要使用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 主要用途是:反復使用一塊較大的動態(tài)分配成功的內(nèi)存來構造不同類型的對象或者它們的數(shù)組。例如可以先申請一個足夠大的字符數(shù)組,然后當需要時在它上面構造不同類型的對象或數(shù)組。placement new不用擔心內(nèi)存分配失敗,因為它根本不分配內(nèi)存,它只是調(diào)用對象的構造函數(shù)。

          測試程序:

          復制代碼 代碼如下:

          #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;//錯誤!不能在此處調(diào)用delete q;

          q->ADT::~ADT();//顯示調(diào)用析構函數(shù)

          delete []p;

          return 0;

          }

          注:使用placement new構造起來的對象或數(shù)組,要顯式調(diào)用它們的析構函數(shù)來銷毀(析構函數(shù)并不釋放對象的內(nèi)存),千萬不要使用delete.這是因為placement new構造起來的對象或數(shù)組大小并不一定等于原來分配的內(nèi)存大小,使用delete會造成內(nèi)存泄漏或者之后釋放內(nèi)存時出現(xiàn)運行時錯誤。

        537222 主站蜘蛛池模板: 强奷白丝美女在线观看| 亚洲人成网站观看在线观看 | 丁香婷婷在线观看| av一区二区中文字幕| 成人综合网亚洲伊人| 亚洲女人天堂成人av在线| 精品国产亚洲一区二区三区在线观看| 国产精品制服丝袜白丝| 无码天堂亚洲国产AV| 91av国产在线| 欧洲一区二区中文字幕| 国产成AV人片久青草影院| 亚洲偷偷自拍码高清视频| 毛片免费观看视频| 国产AV巨作丝袜秘书| 亚洲自偷自拍另类小说| 国产麻豆精品福利在线| 丰满少妇被猛烈进出69影院| 少妇被躁到高潮人苞一| 少妇撒尿一区二区在线视频| 久久人妻无码一区二区三区av| 日本污视频在线观看| 国产精品香蕉在线观看不卡| 久久精品国产亚洲av麻豆甜| 99在线精品国自产拍中文字幕| 亚洲中文字幕永久在线全国| 国产精品自在线拍国产手机版| 91精品国产高清久久久久久g| 国产蜜臀在线一区二区三区| 亚洲一区二区三区四区| 午夜福利电影| 久久精品女人的天堂av| 国产精品任我爽爆在线播放6080| 午夜福利在线观看入口| 亚洲欧美综合另类图片小说区| 97午夜理论电影影院| 久久精品99久久久久久久久| 国产成熟女人性满足视频| 男女肉粗暴进入120秒视频| 亚洲精品一区二区五月天| 久久精品国产亚洲AV高清y w|