C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- å鿍¡æ¿(C++14 èµ·)
- æ´æ°åé¢é
- èååå§å
- æ¯è¾è¿ç®ç¬¦
- é»è®¤æ¯è¾(C++20 èµ·)
- 转ä¹åºå
- for 循ç¯
- while 循ç¯
- ç¨æ·å®ä¹è½¬æ¢
- SFINAE
- 䏻彿°
- ASCII ç 表
- æ è¯ç¬¦
- ç±»å
- å 忍¡å
- 对象
- åºæ¬æ¦å¿µ
- 表达å¼
- 声æ
- åå§å
- 彿°
- è¯å¥
- ç±»
- è¿ç®ç¬¦éè½½
- 模æ¿
- å¼å¸¸
- äºå¡æ§å å
- å ä½ç¬¦ç±»å说æç¬¦ (C++11 èµ·)
- decltype 说æç¬¦
- 彿°å£°æ
- final 说æç¬¦ (C++11 èµ·)
- override 说æç¬¦(C++11 èµ·)
- å¼ç¨å£°æ
- ç§»å¨æé 彿°
- ç§»å¨èµå¼è¿ç®ç¬¦
- æä¸¾å£°æ
- constexpr 说æç¬¦(C++11 èµ·)
- å表åå§å (C++11 èµ·)
- æé 彿°ä¸æååå§åå¨å表
- using 声æ
- nullptrï¼æéåé¢é
- åºç¡ç±»å
- ç±»åå«åï¼å«å模ç (C++11 èµ·)
- å½¢åå
- èåä½å£°æ
- å符串åé¢é
- ç¨æ·å®ä¹åé¢é (C++11 èµ·)
- 屿§è¯´æç¬¦åºå(C++11 èµ·)
- Lambda è¡¨è¾¾å¼ (C++11 èµ·)
- noexcept 说æç¬¦ (C++11 èµ·)
- noexcept è¿ç®ç¬¦ (C++11 èµ·)
- alignof è¿ç®ç¬¦(C++11 èµ·)
- alignas 说æç¬¦ (C++11 èµ·)
- åå¨ç±»è¯´æç¬¦
- åºäºèå´ç for å¾ªç¯ (C++11 èµ·)
- static_assert 声æ
- éå¼è½¬æ¢
- 代ç¨è¿ç®ç¬¦è¡¨ç¤º
- èªå¢/èªåè¿ç®ç¬¦
- æå 表达å¼(C++17 èµ·)
- 类模æ¿å®åæ¨å¯¼(C++17 èµ·)
- 模æ¿å½¢å䏿¨¡æ¿å®å
- if è¯å¥
- inline 说æç¬¦
- ç»æåç»å®å£°æ (C++17 èµ·)
- switch è¯å¥
- å符åé¢é
- å½å空é´
- æ±å¼é¡ºåº
- å¤å¶æ¶é¤
- consteval 说æç¬¦ (C++20 èµ·)
- constinit 说æç¬¦ (C++20 èµ·)
- åç¨ (C++20)
- 模å (C++20 èµ·)
- 约æä¸æ¦å¿µ (C++20 èµ·)
- new 表达å¼
- do-while 循ç¯
- continue è¯å¥
- break è¯å¥
- goto è¯å¥
- return è¯å¥
- 卿å¼å¸¸è¯´æ
- throw 表达å¼
- try å
- å½å空é´å«å
- 类声æ
- cvï¼const ä¸ volatileï¼ç±»åéå®ç¬¦
- é»è®¤åå§å
- å¼åå§å(C++03 èµ·)
- é¶åå§å
- å¤å¶åå§å
- ç´æ¥åå§å
- 常éåå§å
- å¼ç¨åå§å
- å¼ç±»å«
- C++ è¿ç®ç¬¦ä¼å 级
- å¸å°åé¢é
- æµ®ç¹åé¢é
- typedef 说æç¬¦
- æ¾å¼ç±»å转æ¢
- static_cast 转æ¢
- dynamic_cast 转æ¢
- const_cast 转æ¢
- reinterpret_cast 转æ¢
- delete 表达å¼
- æé 彿°ä¸æååå§åå¨å表
- this æé
- 访é®è¯´æç¬¦
- åå 声æ
- virtual 彿°è¯´æç¬¦
- explicit 说æç¬¦
- éææå
- é»è®¤æé 彿°
- å¤å¶æé 彿°
- å¤å¶èµå¼è¿ç®ç¬¦
- ææå½æ°
- 类模æ¿
- 彿°æ¨¡æ¿
- æ¾å¼ï¼å ¨ï¼æ¨¡æ¿ç¹å
- æ±ç¼å£°æ
- C++ çåå²
- ä½ç¨å
- çåæ
- å®ä¹ä¸åä¸å®ä¹è§åï¼ODRï¼
- å忥æ¾
- æéå®çå忥æ¾
- æ éå®çå忥æ¾
- å¦åè§å
- æªå®ä¹è¡ä¸º
- ç¿»è¯é¶æ®µ
- 常é表达å¼
- èµå¼è¿ç®ç¬¦
- ç®æ¯è¿ç®ç¬¦
- é»è¾è¿ç®ç¬¦
- æå访é®è¿ç®ç¬¦
- å ¶ä»è¿ç®ç¬¦
- sizeof è¿ç®ç¬¦
- typeid è¿ç®ç¬¦
- æé声æ
- æ°ç»å£°æ
- è¯è¨é¾æ¥
- 详述类å说æç¬¦
- é»è®¤å®å
- åé¿å®å
- å®åä¾èµæ¥æ¾
- éè½½å³è®®
- éè½½å½æ°çå°å
- æ³¨å ¥ç±»å
- ééææ°æ®æå
- ééææå彿°
- åµå¥ç±»
- æ´¾çç±»
- 空åºç±»ä¼å
- æ½è±¡ç±»
- ä½å
- è½¬æ¢æé 彿°
- æå模æ¿
- 模æ¿å®åæ¨å¯¼
- é¨å模æ¿ç¹å
- sizeof... è¿ç®ç¬¦
- å¾ å³å
- 彿° try å
- æ©å å½åç©ºé´ std
- åæ¯ç¼©å
- RAII
- ä¸/äº/é¶ä¹æ³å
- PImpl
- é¶å¼éåå
- ç±»å
- éå¼è½¬æ¢
- 注é
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >C++ è¯è¨ > new 表达å¼
new 表达å¼
å建并åå§åæ¥æå¨æå卿ç对象ï¼è¿äºå¯¹è±¡ççåæä¸åå®ä»¬åå»ºæ¶æå¨çä½ç¨åéå¶ã
è¯æ³
::(å¯é) new (å¸ç½®åæ°)(å¯é) ( ç±»å ) åå§åå¨(å¯é)
|
(1) | ||||||||
::(å¯é) new (å¸ç½®åæ°)(å¯é) ç±»å åå§åå¨(å¯é)
|
(2) | ||||||||
new int(*[10])(); // é误ï¼åææ (new int) (*[10]) () new (int (*[10])()); // OKï¼åé 10 ä¸ªå½æ°æéçæ°ç»
å¦å¤ï¼æ æ¬å·ç ç±»å æ¯è´ªå¿çï¼å®å°å å«å¯ä»¥æ¯å£°æç¬¦ä¸é¨åçææè®°å·ï¼
new int + 1; // OKï¼åææ (new int) + 1ï¼å¢å new int æè¿åçæé new int * 1; // é误ï¼åææ (new int*) (1)
符åä¸åæ¡ä»¶ä¹ä¸æ¶ åå§åå¨ ä¸æ¯å¯éçï¼å³ä¸å¯ç¼ºçï¼
- ç±»å ä¸ä½¿ç¨äºå ä½ç¬¦ï¼
autoædecltype(auto)(C++14 èµ·)ï¼ - ç±»å æ¯æªç¥è¾¹çæ°ç»
auto p = new auto('c'); // å建å个 char ç±»åç对象ãp æ¯ä¸ä¸ª char* double* p = new double[]{1,2,3}; // å建 double[3] ç±»åçæ°ç»
è§£é
new 表达å¼å°è¯ç³è¯·åå¨ç©ºé´ï¼å¹¶å¨å·²ç³è¯·çåå¨ç©ºé´ä¸ï¼å°è¯æé å¹¶åå§å为ä¸ä¸ªæ åå¯¹è±¡ï¼ææ åå¯¹è±¡çæ°ç»ãnew表达å¼è¿åä¸ä¸ªæåææé ç对象æè
对象æ°ç»ç纯å³å¼æéã
è¥ ç±»å æ¯æ°ç»ç±»åï¼åå ¶ç¬¬ä¸ç»´ä¹å¤çææç»´é½å¿ é¡»æå®ä¸ºæ£ç std::size_t ç±»åæ´æ°å¸¸éè¡¨è¾¾å¼ (C++14 å)ï¼æç»è½¬æ¢ç常éè¡¨è¾¾å¼ (C++14 èµ·)ï¼ä½ç¬¬ä¸ç»´å¯ä»¥æ¯ä»»ä½è½è½¬æ¢æ std::size_t ç表达å¼ãè¿æ¯ç´æ¥å建大å°å¨è¿è¡æ¶å®ä¹çæ°ç»çå¯ä¸æ¹æ³ï¼è¿ç§æ°ç»å¸¸è¢«ç§°ä½å¨ææ°ç»ï¼
int n = 42; double a[n][5]; // é误 auto p1 = new double[n][5]; // okay auto p2 = new double[5][n]; // é误
ä¸åæ åµä¸æå®ç¬¬ä¸ç»´çè¡¨è¾¾å¼æ¯é误çï¼
- è¡¨è¾¾å¼æ¯é类类åï¼ä¸å ¶å¼å¨è½¬æ¢å° std::size_t 忝è´çï¼
- è¡¨è¾¾å¼æ¥æç±»ç±»åï¼ä¸å ¶å¼å¨ç¨æ·å®ä¹è½¬æ¢å½æ°åï¼å¨ç¬¬äºæ¬¡æ å转æ¢åæ¯è´çï¼
- 表达å¼çå¼å¤§äºæä¸ªå®ç°å®ä¹æéï¼
- å
¶å¼å°äºè±æ¬å·åå§åå¨ä¸æä¾çæ°ç»å
ç´ æ°éï¼ä¹å
å«å符串åé¢éä¸çç»æ¢
'\0'ï¼ã
å¦æç¬¬ä¸ç»´å¼å 以ä¸ä»»ä½åå èé误ï¼
- è¥å¨è½¬æ¢å° std::size_t åï¼ç¬¬ä¸ç»´æ¯æ ¸å¿å¸¸é表达å¼ï¼åç¨åºéè¯æï¼å¼åç¼è¯æ¶é误ï¼ï¼
|
(C++14 èµ·) |
|
(C++11 èµ·) |
第ä¸ç»´ä¸ºé¶æ¯å¯æ¥åçï¼åé 彿°ä¹ä¼å¾å°è°ç¨ã
注æï¼std::vector æä¾äºä¸ä¸ç»´ç卿æ°ç»ç±»ä¼¼çåè½ã
åé
new 表达å¼éè¿è°ç¨éå½çåé
彿°åé
åå¨ãè¥ ç±»å æ¯éæ°ç»ç±»åï¼å彿°åæ¯ operator newãè¥ ç±»å æ¯æ°ç»ç±»åï¼å彿°åæ¯ operator new[]ã
å¦åé
彿°ä¸ææè¿°ï¼C++ ç¨åºå¯æä¾è¿äºå½æ°çå
¨å±åç±»ç¹ææ¿æ¢å½æ°ãè¥ new 表达å¼ä»¥å¯éç :: è¿ç®ç¬¦å¼å§ï¼å¦ ::new T æ ::new T[n]ï¼å忽ç¥ç±»ç¹ææ¿æ¢å½æ°ï¼å¨å
¨å±ä½ç¨å䏿¥æ¾å½æ°ï¼ãå¦åï¼è¥ T æ¯ç±»ç±»åï¼åä» T çç±»ä½ç¨åä¸å¼å§æ¥æ¾ã
å¨è°ç¨åé
彿°æ¶ï¼new 表达å¼å°è¯·æ±çåèæ°ä½ä¸º std::size_t ç±»åç第ä¸åæ°ä¼ éç»å®ï¼è¯¥åæ°å¯¹äºéæ°ç» T 精确å°ä¸º sizeof(T)ã
æ°ç»çåé ä¸å¯è½å¸¦æä¸ä¸ªæªææçå¼éï¼overheadï¼ï¼ä¸ä¸¤æ¬¡è°ç¨ new çè¿ä¸ªå¼éå¯è½ä¸åãnew è¡¨è¾¾å¼æè¿åçæéçäºåé 彿°æè¿åçæéå ä¸è¯¥å¼ã许å¤å®ç°ä½¿ç¨æ°ç»å¼éå卿°ç»ä¸ç对象æ°éï¼å®ä¸º delete[] è¡¨è¾¾å¼æç¨ï¼ä»¥è¿è¡æ£ç¡®æ°éçææå½æ°è°ç¨ãå¦å¤ï¼è¥ new 被ç¨äºåé charãunsigned char æ std::byte çæ°ç»ï¼åå®å¯è½ä»åé 彿°è¯·æ±é¢å¤å åï¼ä»¥æ¤ä¿è¯ææä¸å¤§äºè¯·æ±æ°ç»å¤§å°çç±»åç对象ï¼å½å°å ¶æ¾å ¥æåé çæ°ç»ä¸æ¶è½å¤æ£ç¡®å¯¹é½ã
|
å 许å°å个 new 表达å¼éè¿å¯æ¿æ¢åé 彿°æè¿è¡çåé äºä»¥çç¥æåå¹¶ãå¨çç¥çæ åµä¸ï¼åå¨å¯ä»¥ç±ç¼è¯å¨æä¾ï¼èæ éè°ç¨åé 彿°ï¼è¿äº¦å 许ä¼åæä¸ä½¿ç¨ç new 表达å¼ï¼ãå¨åå¹¶çæ åµä¸ï¼ä»¥ä¸æææ¡ä»¶åä¸ºçæ¶ï¼new è¡¨è¾¾å¼ E1 æåçåé å¯ä»¥è¢«æ©å±ï¼ä»¥æä¾å¦ä¸ä¸ª new è¡¨è¾¾å¼ E2 çé¢å¤åå¨ï¼ 1) E1 æåé
对象ççåæä¸¥æ ¼å
å« E2 æåé
对象ççåæï¼
2) E1 ä¸ E2 å°è°ç¨åä¸å¯æ¿æ¢å
¨å±åé
彿°
3) å¯¹äºæåºå¼å¸¸çåé
彿°ï¼E1 ä¸ E2 ä¸çå¼å¸¸å°é¦å
被åä¸å¤çåææã
æ³¨ææ¤ä¼åä»
å¨ä½¿ç¨ new è¡¨è¾¾å¼æ¶å
许ï¼èéè°ç¨å¯æ¿æ¢åé
彿°çä»»ä½å
¶ä»æ¹æ³ï¼delete [] new int[10]; è½è¢«ä¼åæï¼ä½ operator delete(operator new(10)); ä¸è½ã |
(C++14 èµ·) |
|
å¨å¸¸éè¡¨è¾¾å¼æ±å¼æé´ï¼å§ç»çç¥å¯¹åé 彿°çè°ç¨ãåªæå¨å ¶ä»æ åµä¸è°ç¨å¯æ¿æ¢å ¨å±åé 彿°ç new 表达å¼è½å¨å¸¸é表达å¼ä¸æ±å¼ã |
(C++20 èµ·) |
å¸ç½® new
è¥æä¾äº å¸ç½®åæ°ï¼åå°å®ä»¬ä½ä¸ºé¢å¤å®åä¼ éç»åé 彿°ãè¿äºåé 彿°è¢«ç§°ä½âå¸ç½® newâï¼è¿æ¥æºäºæ ååé 彿° void* operator new(std::size_t, void*)ï¼å®ç´æ¥è¿åæªæ´æ¹ç第äºå®åãå®è¢«ç¨äºå¨å·²åé çåå¨ä¸æé 对象ï¼
char* ptr = new char[sizeof(T)]; // åé å å T* tptr = new(ptr) T; // å¨å·²åé åå¨ä¸æé ï¼âå¸ç½®âï¼ tptr->~T(); // 鿝 delete[] ptr; // è§£åé å å
注æï¼åé å¨ (Allocator) ç±»çåæå彿°å°è£ äºæ¤åè½ã
|
å¨åé
å
·æè¶
åº |
(C++17 èµ·) |
new T; // è°ç¨ operator new(sizeof(T)) // (C++17) æ operator new(sizeof(T), std::align_val_t(alignof(T)))) new T[5]; // è°ç¨ operator new[](sizeof(T)*5 + overhead) // (C++17) æ operator new(sizeof(T)*5+overhead, std::align_val_t(alignof(T)))) new(2,f) T; // è°ç¨ operator new(sizeof(T), 2, f) // (C++17) æ operator new(sizeof(T), std::align_val_t(alignof(T)), 2, f)
妿åé 彿°è¿åäºç©ºæéï¼è¿å¨éè½½å³è®®éä¸çæ¯æ æåºçéè½½æ¶å¯è½åçï¼æ¯å¦ new(std::nothrow) T;ï¼ï¼å new 表达å¼ç«å³è¿åï¼èä¸ä¼è¯å¾åå§å对象æè°ç¨è§£åé 彿°ã妿æ åå¸ç½®åé 彿°è¿åäºç©ºæéï¼åè¡ä¸ºæªå®ä¹ï¼è¿å¨ç¨æ·å°ç©ºæéä½ä¸ºå®åä¼ éç»å®æ¶å¯è½åçã (C++17 èµ·)
æé
new è¡¨è¾¾å¼æå建ç对象æç §ä¸åè§ååå§åï¼
- 对äºéæ°ç»ç ç±»åï¼å¨æå¾å ååºå䏿é å个对象ã
- è¥æ åå§åå¨ï¼å对象被é»è®¤åå§åã
- è¥ åå§åå¨ æ¯å¸¦æ¬å·çå®åå表ï¼åå¯¹è±¡è¢«ç´æ¥åå§åã
|
(C++11 èµ·) |
- è¥ ç±»å æ¯æ°ç»ç±»åï¼ååå§åä¸ä¸ªæ°ç»ç对象ã
- è¥æ åå§åå¨ï¼åæ¯ä¸ªå ç´ è¢«é»è®¤åå§åã
- è¥ åå§åå¨ æ¯ä¸å¯¹ç©ºæ¬å·ï¼åæ¯ä¸ªå ç´ è¢«å¼åå§åã
|
(C++11 èµ·) |
|
(C++20 èµ·) |
妿åå§åå æåºå¼å¸¸èç»æ¢ï¼ä¾å¦æ¥èªæé 彿°ï¼ï¼åè¥ new 表达å¼å·²ç»åé
äºä»»ä½åå¨ï¼åå®å°è°ç¨éå½çè§£åé
彿°ï¼å¯¹äºéæ°ç» ç±»å 为 operator deleteï¼å¯¹äºæ°ç» ç±»å å为 operator delete[]ãè¥ new 表达å¼ä½¿ç¨ ::new è¯æ³ï¼åå¨å
¨å±ä½ç¨åæ¥æ¾è§£åé
彿°ï¼å¦åè¥ T æ¯ç±»ç±»åï¼åå¨ T çä½ç¨åæ¥æ¾ãè¥å¤±è´¥çæ¯å¸¸è§ï¼éå¸ç½®ï¼åé
彿°ï¼åéµå¾ª delete 表达å¼ä¸æè¿°çè§åæ¥æ¾è§£åé
彿°ã对äºå¤±è´¥çå¸ç½® newï¼ä¸ä¹å¹é
çè§£åé
彿°ä¸é¤ç¬¬ä¸ä¸ªå¤çææå½¢åçç±»åï¼å¿
é¡»ä¸å¸ç½® new çåå½¢åç±»åç¸åã对解åé
彿°çè°ç¨ä¸ï¼å°å
åä»åé
彿°åå¾çå¼ä½ä¸ºç¬¬ä¸å®åï¼å°å¯¹é½ä½ä¸ºå¯éç对é½åæ°ï¼ (C++17 èµ·)å¹¶å° å¸ç½®åæ°ï¼è¥åå¨ï¼ä½ä¸ºé¢å¤çå¸ç½®åæ°ãè¥æ¾ä¸å°è§£åé
彿°ï¼åä¸è§£åé
å
åã
å åæ³æ¼
new è¡¨è¾¾å¼æå建çå¯¹è±¡ï¼æ¥æå¨æå卿ç对象ï¼ï¼æç»å°å° new è¡¨è¾¾å¼æè¿åçæéç¨äºå¹é ç delete 表达å¼ä¹æ¶ãè¥æéçåå¼ä¸¢å¤±ï¼å对象å为ä¸å¯è¾¾ä¸æ æ³è§£åé ï¼åçå åæ³æ¼ (memory leak)ã
对æéèµå¼æ¶å¯è½åçï¼
int* p = new int(7); // 卿åé ç int å¸¦å¼ 7 p = nullptr; // å åæ³æ¼
ææé离å¼ä½ç¨åï¼
void f() { int* p = new int(7); } // å åæ³æ¼
æå 为å¼å¸¸
void f() { int* p = new int(7); g(); // å¯è½æåºå¼å¸¸ delete p; // è¥æ å¼å¸¸å ok } // è¥ g() æåºå¼å¸¸åå åæ³æ¼
为ç®å卿åé ç对象管çï¼éå¸¸å° new 表达å¼çç»æåå¨äºæºè½æéä¸ï¼std::auto_ptr (C++17 å)std::unique_ptr æ std::shared_ptr (C++11 èµ·)ãè¿äºæéä¿è¯å¨ä¸è¿°æ 形䏿§è¡ delete 表达å¼ã
å ³é®è¯
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 1992 | C++14 | new (std::nothrow) int[N] å¯è½æåº bad_array_new_length | æ¹ä¸ºè¿å空æé |
| P1009R2 | C++11 | new 表达å¼ä¸ä¸è½æ¨å¯¼æ°ç»è¾¹ç | 容许æ¨å¯¼ |