• <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的用法

    c語言new的用法

    時間: 長思709 分享

    c語言new的用法

      C語言中new有三種使用方式:plain new,nothrow new和placement new:下面小編就和大家細說這三種用法分別是什么。
      c語言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會造成內存泄漏或者之后釋放內存時出現運行時錯誤。
    512884 主站蜘蛛池模板: 精品国精品自拍自在线| 4hc88四虎www在线影院短视频| 男人肌肌捅女人肌肌视频| 国产精品一区二区在线观看| 久久精品国产99国产| 田中瞳中文字幕久久精品| 国产精品亚洲片在线观看不卡| 中国美女一级看片| 波多野结衣先锋影音| 国产亚洲AV人片在线观看| 91短视频在线免费观看| 最新国产精品拍自在线播放| 国产一区中文字幕在线观看| a级毛片免费高清视频| 欧美成人鲁丝片在线观看| 国产成人综合久久综合| 中文天堂最新版www在线观看| 欧美亚洲国产片在线播放| 国产a∨精品一区二区三区不卡| 777丰满影院| 日本免费精品一区二区三区| 亚洲熟女乱色一区二区三区| 美女激情视频网站| 在电影院嗯啊挺进去了啊视频| 亚洲AV无码成人网站在线观看| 翁虹三级伦理电影大全在线观看| 国产白嫩漂亮美女在线观看| 中国jizz日本| 日韩电影免费在线观看视频| 亚洲欧美一区二区三区四区| 精品国产第一国产综合精品| 国产免费怕怕免费视频观看| 99精品人妻无码专区在线视频区 | 18精品久久久无码午夜福利| 日本亚洲国产一区二区三区| 亚洲国产美女在线观看| 翁想房中春意浓1-28| 国产成人亚洲综合无码| 538免费视频| 夜夜爽夜夜叫夜夜高潮漏水| 一级看片免费视频囗交|