日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

深入new/delete:Operator new的全局重载

發(fā)布時(shí)間:2023/12/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入new/delete:Operator new的全局重载 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Operator new 的全局重載

原文地址:http://blog.csdn.net/zhenjing/article/details/4354880

我們經(jīng)常看到這么一句話(huà): operator new 可以重載, placement new 不可重載。其實(shí)此處所說(shuō)的不可重載應(yīng)該是指全局的 placement new 不可重載,對(duì)于類(lèi)域中的 placement new 是可以重載的,而且只要重載了任何一種形式的 operator new 都應(yīng)該順便重載 placement new , 即 void * operator new(std::size_t count, void *ptr) 。

操作符重載一般用于特定類(lèi)型,名字解析過(guò)程同一般的函數(shù)重載。 Operator new 由于其特殊性,編譯器提供了默認(rèn)提供 6 種全局重載形式,同時(shí)還允許用戶(hù)提供自定義的全局 operator new ,其參數(shù)甚至可以和全局版本一樣,除全局 placement new 外。對(duì)于類(lèi)域,任何形式的 new 都是可以重載的,包括 placement new 形式。

?

全局的 operator new( 函數(shù) ) 有六種重載形式

void *operator new(std::size_t count)

??? throw(std::bad_alloc);?????????? // 一般的版本

?

void *operator new(std::size_t count,?? // 兼容早版本的 new

??? const std::nothrow_t&) throw();?? // 內(nèi)存分配失敗不會(huì)拋出異常

?

void *operator new(std::size_t count, void *ptr) throw();? //placement 版本

??????????????????????????????????????

void *operator new[](std::size_t count)? //

??? throw(std::bad_alloc);

?

void *operator new[](std::size_t count,? //

??? const std::nothrow_t&) throw();

?

void *operator new[](std::size_t count, void *ptr) throw();

?

重載 operator new 規(guī)則

重載 operator new 的參數(shù)個(gè)數(shù)是可以任意的 , 只需要保證第一個(gè)參數(shù)為 size_t, 返回類(lèi)型為 void * 即可 , 而且其重載的參數(shù)類(lèi)型也不必包含自定義類(lèi)型 . 更一般的說(shuō) , operator new 的重載更像是一個(gè)函數(shù)的重載 , 而不是一個(gè)操作符的重載 . 如:

?

全局重載示例:

void* operator new(size_t size)? // 重載成功

{

?? printf("global new/n");

?? return malloc(size);

?? //return ::operator new(size);? // 遞歸調(diào)用提示 (warning)

}

?

//void *operator new(std::size_t size, void *ptr) // 無(wú)法重載

//{

//???? printf("global new/n");

//???? return ::operator new(size,ptr);

//}

?

void * operator new(size_t size, const std::nothrow_t& e) // 重載成功 , 遞歸調(diào)用提示 (warning)

{

?????? printf("global new/n");

?????? return ::operator new(size, e);

}

?

一般形式的 operator new 重載示例:

void * operator new(size_t size, int x, int y, int z)

{

??? ...

}

X * pX = new (1, 2, 3) X;

?

char data[1000][sizeof(foo)];

inline void* operator new(size_t size, int n)

{

??????? return data[n];

}

就可以使用這樣有趣的語(yǔ)法來(lái)創(chuàng)建對(duì)象 :

foo *p=new(6) foo(); // 把對(duì)象創(chuàng)建在 data 的第六個(gè)單元上

轉(zhuǎn)載于:https://www.cnblogs.com/dragon2012/p/3571838.html

總結(jié)

以上是生活随笔為你收集整理的深入new/delete:Operator new的全局重载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。