深入new/delete:Operator new的全局重载
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)題。
- 上一篇: 自助火锅多少钱啊?
- 下一篇: BI-SqlServer