我發(fā)現(xiàn)在 C++17 中,std::allocator::destroy
被廢棄了:
http://zh.cppreference.com/w/...
而替代方案是顯示調(diào)用析構(gòu)函數(shù)。就此我產(chǎn)生了一個(gè)疑問(wèn),為了描述清楚,先構(gòu)造一個(gè)類(lèi):
template<typename T> class Object {
T* data_;
public:
Object() { data_ = (T*) malloc(sizeof(T)); }
void Construct() { new (data_) T(); }
void Destory() { data_->~T(); }
T& operator->() { return *data_; }
~Object() { free(data_); }
};
我認(rèn)為 Object<int>::Destory()
會(huì)導(dǎo)致 data_->~int()
,而后者自然是不能通過(guò)編譯的。
但測(cè)試發(fā)現(xiàn),Object<int> o
的構(gòu)造不會(huì)產(chǎn)生編譯錯(cuò)誤(g++ (Ubuntu 4.9.3-13ubuntu2) 4.9.3)。那么:
data_->~T()
的行為?感謝 @felix 指教,為了清晰起見(jiàn),我自答一下:
這個(gè)行為是 C++ 標(biāo)準(zhǔn)的,還是 g++ 特有的?
這種行為是 C++ 標(biāo)準(zhǔn)的。參考:
http://zh.cppreference.com/w/...
之中【內(nèi)建的成員訪問(wèn)運(yùn)算符】,第四種用法:
expr -> pseudo-destructor
expr 是一個(gè)標(biāo)量類(lèi)型,pseudo-destructor 為一個(gè) ~ 之后跟著代表與 expr 相同類(lèi)型的類(lèi)型名,所構(gòu)成的函數(shù)調(diào)用表達(dá)式被稱(chēng)為偽析構(gòu)函數(shù)調(diào)用。它不接受任何參數(shù),返回 void,且除了對(duì)開(kāi)頭的 expr 求值之外不實(shí)施任何操作。允許進(jìn)行偽析構(gòu)函數(shù)調(diào)用,使得編寫(xiě)代碼而無(wú)需了解某個(gè)給定類(lèi)型是否存在析構(gòu)函數(shù)成為可能。
上面敘述中的類(lèi)型名(type name)對(duì)當(dāng)前語(yǔ)法來(lái)說(shuō),可以指 typedef 或者 using(type alias)聲明的名字,而不指類(lèi)型本身。舉例說(shuō)明:
int main() {
typedef int Int;
int* p = new int(10);
p->~Int(); // ok, do nothing
// p->~int(); error: expected identifier before ‘int’
return 0;
}
data_->~T()
的行為?當(dāng) T 是標(biāo)量類(lèi)型(可有 cv 限定的算術(shù)、指針、指向成員指針、枚舉或 std::nullptr_t 類(lèi)型)時(shí),它表示偽析構(gòu)函數(shù)調(diào)用,即除了對(duì) data_
取值不做任何事。
當(dāng) T 不是標(biāo)量類(lèi)型時(shí),它顯式調(diào)用了 data_
的析構(gòu)函數(shù)。
這種行為讓 data_->~T()
的調(diào)用變得很理想。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。