关于placement new 和 placement delete的重载,以及basic_string重载new()实例
關(guān)于placement new
在https://blog.csdn.net/qq_42604176/article/details/111997397中已經(jīng)介紹了placement new的形式。
它的形式為new()/delete().我們將分配好內(nèi)存的指針?biāo)腿肜ㄌ?hào)中,就完成了初步的調(diào)用了。
其實(shí)我們可以定義放任何的東西到()內(nèi)部。只放一個(gè)指針的版本是的new()是標(biāo)準(zhǔn)庫先寫好給我們的。
我們可以重載operator new,并寫出多個(gè)版本,如:
前提是每一個(gè)版本的聲明都必須由獨(dú)特的參數(shù)列,其中第一個(gè)參數(shù)必須是size_t,這是因?yàn)楫?dāng)沒有()時(shí),進(jìn)行的是new Foo操作,Foo的大小會(huì)被傳進(jìn)operator new中作為第一參數(shù),Foo的大小是個(gè)size_t類型。所以我們寫的各種各樣的版本也必須遵循這個(gè)規(guī)則。第二第三參數(shù)等等可由自己設(shè)計(jì)。new()括號(hào)中的就是第二第三參數(shù),他們可以指定placement arguments 為初值。
下面是實(shí)例:
關(guān)于placement delete
我們也可以重載placement operator delete,并對應(yīng)著placement operator new寫出多個(gè)對應(yīng)版本,但他們絕對不會(huì)被delete調(diào)用。
只有當(dāng)new所調(diào)用的ctor拋出異常,才會(huì)調(diào)用這些重載版本的operator delete。
也就是說重載的placement operator delete是用來釋放未能成功創(chuàng)建的對象所占的內(nèi)存。(正如我們所知,創(chuàng)建一個(gè)對象實(shí)際上是先申請空間,再調(diào)用構(gòu)造函數(shù)。空間申請到了,但是對象卻沒構(gòu)造出來,那么理所當(dāng)然需要將空間釋放)
對應(yīng)上面的四種版本的delete:
侯捷老師給出了下面的示例,運(yùn)行到第五種。我們可以發(fā)現(xiàn),此時(shí)的構(gòu)造函數(shù)調(diào)用的是第二種構(gòu)造函數(shù)。在之前的定義中,我們在這里拋出了異常。
接下倆便是這幾條語句的執(zhí)行結(jié)果:
如上所示,這些new都被重載了。所以才會(huì)打印信息。
按照道理,在構(gòu)造函數(shù)拋出異常后,會(huì)調(diào)用自己重載的placement delete,打印信息。但在這里并沒有,這是編譯器的原因。
關(guān)于basic_string重載new()來擴(kuò)充申請量
basic_string是標(biāo)準(zhǔn)庫里面的一個(gè)class,就是我們使用的字符串。
如下:
operator new的具體代碼如下:
template<class charT,class traits, class Allocator> inline void* basic_string<charT,traits,Allocator>::Rep:: operator new(size_t s,size_t extra) {return Allocator::allocate(s + extra * sizeof(charT)); }如何使用看這兒:
這里我們把第二參數(shù)叫做extra。它的作用是,當(dāng)使用者去創(chuàng)建一個(gè)字符串,如"hello",加上結(jié)束符一共6個(gè)字符。但是它在分配的時(shí)候還會(huì)分配extra個(gè)字符大小的空間。具體原因不做細(xì)究。
它的placement delete重載之后則長這樣:
template<class charT,class traits,class Allocator> inline void basic_string<charT,traits,Allocator>::Rep:: operator delete(void* ptr) {Allocator::deallocate(ptr,sizeof(Rep) + reinterpret_cast<Rep*>(ptr)->res * sizeof(charT)); }總結(jié)
以上是生活随笔為你收集整理的关于placement new 和 placement delete的重载,以及basic_string重载new()实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 颐和园走哪个门进方便
- 下一篇: 划分数据集代码(按照4:1的比例)以及根