免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C++中運(yùn)算符New的三種使用方式

這是在林銳的《高質(zhì)量程序設(shè)計(jì)指南》中看到的,特此記錄下。

1. plain new 普通new

Cpp代碼
  1. <span style="font-size: medium;">void*operator new(std::size_t)throw(std::bad_alloc);   
  2. void operator deletevoid *) throw();   
  3. </span>  

  該運(yùn)算符在分配失敗時(shí)將拋出異常,而非返回NULL。使用時(shí)要包含 <new>頭文件。正常使用new,但要配以異常處理。如:

Cpp代碼
  1. <span style="font-size: medium;">char *getMemory(unsigned long size)   
  2. {    char * p = new char[size];   
  3.       return p; }   
  4. void main(void )   
  5. {    try{   
  6.         char * p = getMemory(1000000);//可能發(fā)生異常   
  7.         // ...   
  8.         delete [ ] p;   
  9.         }   
  10.     catch(const std::bad_alloc & ex)   
  11.     {  cout < <ex.what();    }   
  12. } </span>  

 

 

2.nothrow new  不拋擲異常new

Cpp代碼
  1. <span style="font-size: medium;">void*operator new(std::size_t,const std::nothrow_t & )throw();   
  2. void operator deletevoid *) throw(); </span>  

 該運(yùn)算符在分配失敗時(shí)不拋出異常,而是返回NULL。使用時(shí)要包含 <new>頭文件。
該函數(shù)的第2形參是 struct nothrow_t {  };它是個(gè)全局常對象 const nothrow_t nothrow; 用來作為 new 運(yùn)算符的標(biāo)志,以區(qū)別前一個(gè)new.

Cpp代碼
  1. <span style="font-size: medium;">void func(unsinged long length)   
  2. {   
  3.        unsinged char * p = new(nothrow) unsinged char[length];   
  4.       //在使用這種new時(shí)要加(nothrow) ,明示不使用異常處理 。   
  5.   
  6.     if ( p == NULL)  // 因不拋異常,故定要檢查   
  7.         cout < <“allocte failed !”;   
  8.       // ...   
  9.      delete [ ] p;   
  10. } </span>  

 

 

3.placement new 放置new

Cpp代碼
  1. <span style="font-size: medium;">void*operator new(std::size_t ,void *);   
  2. void operator deletevoid * ,void *); </span>  

 該運(yùn)算符是在已分配的內(nèi)存上重新構(gòu)造對象,因?yàn)椴环峙鋬?nèi)存,所以不必?fù)?dān)心分配失敗。唯一的工作是調(diào)用構(gòu)造函數(shù)。要包含 <new>頭文件。

Cpp代碼
  1. <span style="font-size: medium;"># include <new>   
  2. # include <iostream>   
  3. void main()   
  4. {  using namespace std;   
  5.     char * p = new(nothrowchar [4];   
  6.     if (p == NULL)   
  7.     {  cout < <“allocte failed” < <endl;  exit( -1 );    }   
  8.     // ...   
  9.     long * q = new(p)long(1000);   
  10.     delete [ ]p;    //只釋放 p,不要用q釋放。   
  11. } </span>  

 p和q僅僅是首址相同,所構(gòu)建的對象可以類型不同。所“放置”的空間應(yīng)小于原空間,以防不測。當(dāng)”放置new”超過了申請的范圍,Debug版下會掛機(jī),但Release版竟然能運(yùn)行而不出錯(cuò)!

 

該運(yùn)算符的作用是:只要第一次分配成功,不再擔(dān)心分配失敗。

Cpp代碼
  1. <span style="font-size: medium;"># include <new>   
  2. # include <iostream>   
  3. void main()   
  4. {  using namespace std;   
  5.     char * p = new(nothrowchar [100];   
  6.     if (p == NULL)   
  7.     {  cout < <“allocte failed” < <endl;  exit( -1 );    }   
  8.     long * q1 = new(p)long(100);   
  9.     // 使用q1  ...   
  10.     int * q2 = new(p) int[100/sizeof(int) ];   
  11.     // 使用q2 ...   
  12.     ADT * q3 = new(p) ADT[100/sizeof(ADT) ];   
  13.     // 使用q3  然后釋放對象 ...   
  14.     delete [ ]p;    //只釋放空間,不再析構(gòu)對象。   
  15. } </span>  

 注意:使用該運(yùn)算符構(gòu)造的對象或數(shù)組,一定要顯式調(diào)用析構(gòu)函數(shù),不可用delete代替析構(gòu),因?yàn)閜lacement new 的對象的大小不再與原空間相同。

Cpp代碼
  1. <span style="font-size: medium;"># include <new>   
  2. # include <iostream>   
  3. void main()   
  4. {  using namespace std;   
  5.     char * p = new(nothrowchar [sizeof(ADT)+2];   
  6.     if (p == NULL)   
  7.     {  cout < <“allocte failed” < <endl;  exit( -1 );    }   
  8.     // ...   
  9.     ADT * q = new(p) ADT;   
  10.     // ...   
  11.     // delete q;    // 錯(cuò)誤   
  12.     q-> ADT::~ADT(); //顯式調(diào)用析構(gòu)函數(shù),僅釋放對象   
  13.     delete [ ]p;    //最后,再用原指針來釋放內(nèi)存.   
  14. } </span>  

  placement new 的主要用途就是可以反復(fù)使用一塊已申請成功的內(nèi)存空間。這樣可以避免申請失敗的徒勞,又可以避免使用后的釋放。

    特別要注意的是對于 placement new 絕不可以調(diào)用的delete, 因?yàn)樵搉ew只是使用別人替它申請的地方(只是個(gè)租房戶,不是房主。無權(quán)將房子賣掉)。釋放內(nèi)存是nothrow new的事,即要使用原來的指針釋放內(nèi)存.

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
談C/C++指針精髓
c++11-17 模板核心知識(十四)—— 解析模板之依賴型模板名稱 Dependent Names of Templates(.template/->template/::template)
全網(wǎng)首發(fā)??!C 20新特性全在這一張圖里了
一個(gè)跨平臺的 C 內(nèi)存泄漏檢測器
newnewnew(transfered) - fleeting_ash的日志 - 網(wǎng)易博...
C++ String
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服