c語(yǔ)言new函數(shù)的用法優(yōu)秀

格式:DOC 上傳日期:2023-04-27 18:10:59
c語(yǔ)言new函數(shù)的用法優(yōu)秀
時(shí)間:2023-04-27 18:10:59     小編:zdfb

無(wú)論是身處學(xué)校還是步入社會(huì),大家都嘗試過(guò)寫作吧,借助寫作也可以提高我們的語(yǔ)言組織能力。范文怎么寫才能發(fā)揮它最大的作用呢?下面是小編為大家收集的優(yōu)秀范文,供大家參考借鑒,希望可以幫助到有需要的朋友。

c語(yǔ)言new函數(shù)的用法篇一

c語(yǔ)言中new有三種使用方式:plain new,nothrow new和placement new等。下面小編就和大家細(xì)說(shuō)這三種用法分別是什么。

(1)plain new顧名思義就是普通的new,就是我們慣常使用的new。在c++中是這樣定義的:

void* operator new(std::size_t) throw(std::bad_alloc);

void operator (void *) throw();

提示:plain new在分配失敗的情況下,拋出異常std::bad_alloc而不是返回null,因此通過(guò)判斷返回值是否為null是徒勞的。

(2)nothrow new是不拋出異常的運(yùn)算符new的形式。nothrow new在失敗時(shí),返回null。定義如下:

void * operator new(std::size_t,const std::nothrow_t&) throw();

void operator (void*) throw();

(3)placement new意即“放置”,這種new允許在一塊已經(jīng)分配成功的內(nèi)存上重新構(gòu)造對(duì)象或?qū)ο髷?shù)組。placement new不用擔(dān)心內(nèi)存分配失敗,因?yàn)樗静环峙鋬?nèi)存,它做的唯一一件事情就是調(diào)用對(duì)象的構(gòu)造函數(shù)。定義如下:

void* operator new(size_t,void*);

void operator (void*,void*);

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

提示2:placement new構(gòu)造起來(lái)的對(duì)象或其數(shù)組,要顯示的調(diào)用他們的析構(gòu)函數(shù)來(lái)銷毀,千萬(wàn)不要使用。

char* p = new(nothrow) char[100];

long *q1 = new(p) long(100);

int *q2 = new(p) int[100/sizeof(int)];

new/.普通的'new

定義如下:

void *operator new(std::size_t) throw(std::bad_alloc);

void operator (void*) throw();

注:標(biāo)準(zhǔn)c++ plain new失敗后拋出標(biāo)準(zhǔn)異常std::bad_alloc而非返回null,因此檢查返回值是否為null判斷分配是否成功是徒勞的。

測(cè)試程序:

復(fù)制代碼 代碼如下:

#include "stdafx.h"

#include

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;

[] p;

}

catch(const std::bad_alloc &ex)

{

cout<<()<<endl;

}

return 0;

}

w new/不拋出異常的運(yùn)算符new的形式,new失敗時(shí)返回null。

定義如下:

復(fù)制代碼 代碼如下:

void *operator new(std::size_t,const std::nothrow_t&) throw();

void operator (void*) throw();

struct nothrow_t{}; const nothrow_t nothrow;//nothrow作為new的標(biāo)志性啞元

測(cè)試程序:

復(fù)制代碼 代碼如下:

#include "stdafx.h"

#include

#include

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;

[] p;

}

catch(const std::bad_alloc &ex)

{

cout<<()<<endl;

}

return 0;

}

ent new/ 主要用途是:反復(fù)使用一塊較大的動(dòng)態(tài)分配成功的內(nèi)存來(lái)構(gòu)造不同類型的對(duì)象或者它們的數(shù)組。例如可以先申請(qǐng)一個(gè)足夠大的字符數(shù)組,然后當(dāng)需要時(shí)在它上面構(gòu)造不同類型的對(duì)象或數(shù)組。placement new不用擔(dān)心內(nèi)存分配失敗,因?yàn)樗静环峙鋬?nèi)存,它只是調(diào)用對(duì)象的構(gòu)造函數(shù)。

測(cè)試程序:

復(fù)制代碼 代碼如下:

#include "stdafx.h"

#include

#include

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:不必?fù)?dān)心失敗

// q;//錯(cuò)誤!不能在此處調(diào)用 q;

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

[]p;

return 0;

}

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

s("content_relate");

【c語(yǔ)言new的用法介紹】相關(guān)文章:

1.

c語(yǔ)言new的用法

2.

c語(yǔ)言方括號(hào)的用法介紹

3.

assert用法(c語(yǔ)言)

4.

c語(yǔ)言指針的用法

5.

c語(yǔ)言strcmp的用法

6.

c語(yǔ)言if語(yǔ)句的用法

7.

c語(yǔ)言鏈表的用法

8.

c語(yǔ)言中assert用法

【本文地址:http://gzsthw.cn/zuowen/2732396.html】

全文閱讀已結(jié)束,如果需要下載本文請(qǐng)點(diǎn)擊

下載此文檔