分享C++三種類型new類型的運(yùn)算符使用詳情
1.new操作符
new operator,平時(shí)用的最多的new操作符,其對(duì)應(yīng)delete operator,不能被重載,其包含兩個(gè)操作(既申請(qǐng)空間,又調(diào)用構(gòu)造函數(shù))
- (1)使用::operator new申請(qǐng)內(nèi)存
- (2)調(diào)用類的構(gòu)造函數(shù)
class CTestUse { public: ? ? CTestUse() { cout << __FUNCTION__ << endl; } ? ? virtual ~CTestUse() { cout << __FUNCTION__ << endl; } ? private: }; ? void test() { ? ? string *pStr = new string("new operator"); ? ? cout << *pStr << endl; ? ? delete pStr; ? ? ? CTestUse *pCase = new CTestUse; ? ? delete pCase; } ? ? int main(int argc, char *argv[]) { ? ? test(); ? ? ? return 0; }
運(yùn)行結(jié)果如下:
2.::operator new
::operator new,只會(huì)申請(qǐng)空間,不會(huì)調(diào)用構(gòu)造函數(shù),可以被重載,其對(duì)應(yīng) ::operator delete (只申請(qǐng)空間)
2.1原始調(diào)用
class CTestUse1 { public: ? ? CTestUse1() { cout << __FUNCTION__ << endl; } ? ? virtual ~CTestUse1() { cout << __FUNCTION__ << endl; } ? ? void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; } ? private: }; ? ? void test1() { ? ? CTestUse1 *pCase = (CTestUse1 *)::operator new (sizeof(CTestUse1)); ? ? pCase->show(); ? ? ::operator delete(pCase); ? } ? int main(int argc, char *argv[]) { ? ? test1(); ? ? ? return 0; }
運(yùn)行結(jié)果如下:
2.2重載1
class CTestUse2 { public: ? ? CTestUse2() { cout << __FUNCTION__ << endl; } ? ? virtual ~CTestUse2() { cout << __FUNCTION__ << endl; } ? ? void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; } ? ? ? void* operator new(size_t size) { ? ? ? ? cout << __FUNCTION__ << endl; ? ? ? ? return ::operator new(size); ? ? } ? ? ? void operator delete(void* ptr) { ? ? ? ? cout << __FUNCTION__ << endl; ? ? ? ? ::operator delete(ptr); ? ? } ? private: }; ? void test2() { ? ? CTestUse2 *pCase = new CTestUse2; ? ? pCase->show(); ? ? delete pCase; ? } ? int main(int argc, char *argv[]) { ? ? test2(); ? ? ? return 0; }
運(yùn)行結(jié)果如下:
2.3重載2
class CTestUse3 { public: ? ? CTestUse3() { cout << __FUNCTION__ << endl; } ? ? virtual ~CTestUse3() { cout << __FUNCTION__ << endl; } ? ? void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; } ? ? ? void* operator new(size_t size, string str) { ? ? ? ? cout << __FUNCTION__ << str << endl; ? ? ? ? return ::operator new(size); ? ? } ? ? ? void operator delete(void* ptr) { ? ? ? ? cout << __FUNCTION__ << endl; ? ? ? ? ::operator delete(ptr); ? ? } ? private: }; ? void test3() { ? ? CTestUse3 *pCase = new ("heshiyang") CTestUse3; ? ? pCase->show(); ? ? delete pCase; ? } ? int main(int argc, char *argv[]) { ? ? test3(); ? ? ? return 0; }
運(yùn)行結(jié)果如下:
3.place new
place new在已經(jīng)構(gòu)建好的內(nèi)存中創(chuàng)建對(duì)象,其只會(huì)返回已經(jīng)申請(qǐng)好的內(nèi)存指針,多用在高性能場(chǎng)景下,提前申請(qǐng)好內(nèi)存,可以節(jié)省申請(qǐng)內(nèi)存開(kāi)消 (只調(diào)用構(gòu)造函數(shù))
class CTestUse4 { public: ? ? CTestUse4() { cout << __FUNCTION__ << endl; } ? ? virtual ~CTestUse4() { cout << __FUNCTION__ << endl; } ? ? void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; } ? ? ? void* operator new(size_t size, void* p) { ? ? ? ? cout << __FUNCTION__ << endl; ? ? ? ? return p; ? ? } ? ? ? void operator delete(void* ptr) { ? ? ? ? cout << __FUNCTION__ << endl; ? ? ? ? ::operator delete(ptr); ? ? } ? private: }; ? void test4() { ? ? char* pChar = new char[sizeof(CTestUse4)]; ? ? CTestUse4* pCase = new (pChar) CTestUse4; //調(diào)用全局::new (pChar) CTestUse4,new (pChar) CTestUse4調(diào)用重載new ? ? //delete pCase; ? ? pCase->~CTestUse4(); } ? int main(int argc, char *argv[]) { ? ? test4(); ? ? ? return 0; }
運(yùn)行結(jié)果如下:
到此這篇關(guān)于C++三種類型new運(yùn)算符的使用詳情的文章就介紹到這了,更多相關(guān)C++ new運(yùn)算符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11 移動(dòng)構(gòu)造函數(shù)的使用
本文主要介紹了C++11 移動(dòng)構(gòu)造函數(shù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Qt?加載?libjpeg?庫(kù)出現(xiàn)“長(zhǎng)跳轉(zhuǎn)已經(jīng)運(yùn)行”錯(cuò)誤問(wèn)題解決
這篇文章主要介紹了Qt?加載?libjpeg?庫(kù)出現(xiàn)“長(zhǎng)跳轉(zhuǎn)已經(jīng)運(yùn)行”錯(cuò)誤,本文給大家分享完美解決方案,需要的朋友可以參考下2023-04-04