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

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

      <nobr id="0a85b"></nobr>
        <tr id="0a85b"></tr>
        9久久伊人精品综合,亚洲一区精品视频在线,成 人免费va视频,国产一区二区三区黄网,99国产精品永久免费视频,亚洲毛片多多影院,精品久久久无码人妻中文字幕,无码国产欧美一区二区三区不卡
        學習啦 > 學習英語 > 專業英語 > 計算機英語 > 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 主站蜘蛛池模板: 中文字幕制服国产精品| 国产成人精品亚洲日本片| 国产成人精品亚洲精品日日| 国产一区二区激情对白在线| 九九热视频在线精品18| 亚洲18禁一区二区三区| 五月丁香六月狠狠爱综合| 欧美激情综合色综合啪啪五月 | 下面一进一出好爽视频| 日韩乱码人妻无码中文字幕| 色综合AV综合无码综合网站| 五月天国产成人AV免费观看| 国产精品久久久久9999| 好男人官网资源在线观看| 天堂√在线中文官网在线| 精品国产亚洲午夜精品av| 亚洲深深色噜噜狠狠网站| 国产国产成人精品久久蜜| 97se综合| 国产精品一区中文字幕| 俄罗斯少妇性XXXX另类| 韩国18禁啪啪无遮挡免费 | 色欲av伊人久久大香线蕉影院| 福利一区二区1000| 老司机午夜精品视频资源| 国产精品不卡一区二区在线| 日韩av裸体在线播放| 国产偷国产偷亚洲高清人| 国产欧美日韩免费看AⅤ视频| 国产麻豆精品手机在线观看| 国产精品国产三级国产a| 午夜福利视频| 亚洲ΑV久久久噜噜噜噜噜| 成人国产一区二区三区精品| 丁香五月亚洲综合在线国内自拍| 国产丰满麻豆videossexhd| 国产视频深夜在线观看| 漂亮人妻被中出中文字幕久久| 国产一区二区不卡在线视频| 国产免费高清69式视频在线观看| 亚洲av成人无网码天堂|