• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦>學習英語>專業英語>計算機英語>

    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允許在一塊已經分配成功的內存上重新構造對象或對象數組。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會造成內存泄漏或者之后釋放內存時出現運行時錯誤。

    537222 主站蜘蛛池模板: 亚洲精品在线免费观看| 国产精品99久久久久久www| 另类图片亚洲校园小说区| 久久国产免费福利永久| 91网站免费观看| 最新电影天堂快影eeuss | 国产又猛又黄又爽| 久久精品国产自在一线| 黑人巨鞭大战欧美肥妇| 曰批视频免费30分钟成人| 国产护士一区二区三区| 久久综合久久综合九色| 鸡鸡插屁股视频| 日日操夜夜操免费视频| 国产a级小龙女乱理片| 中文字幕一区日韩在线视频| 美女视频黄频a免费大全视频| 性美国xxxxx免费| 免费网站看v片在线a| www.欧美xxx| 熟女精品视频一区二区三区| 在线视频一区二区三区在线播放| 亚洲精品视频在线播放| 777成影片免费观看| 欧美叉叉叉BBB网站| 国产欧美一区二区精品久久久| 九一制片厂免费传媒果冻| 露暴的楠楠健身房单车| 成人无遮挡裸免费视频在线观看 | 久青草影院在线观看国产| 黑白配hd视频| 放荡性漫画全文免费| 免费看黄的网站在线看| 97在线视频免费| 极品粉嫩小泬白浆20p| 国产亚洲欧美日韩在线观看不卡| 中文字幕在线第二页| 男男gay18| 国产精品兄妹在线观看麻豆| 久久精品中文字幕第一页| 美女胸又www又黄网站|