C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- std::unique_ptr
- std::scoped_allocator_adaptor
- std::auto_ptr
- std::destroy_at
- std::destroy
- std::destroy_n
- std::uninitialized_move
- std::uninitialized_value_construct
- std::owner_less
- std::shared_ptr
- std::to_address
- std::assume_aligned
- std::make_obj_using_allocator
- C å å管çåº
- ä½å±å å管ç
- operator delete, operator delete[]
- std::align_val_t
- std::bad_alloc
- std::bad_array_new_length
- operator new, operator new[]
- std::addressof
- std::allocator_traits
- std::default_delete
- std::allocator_arg_t
- std::allocator_arg
- std::weak_ptr
- std::enable_shared_from_this
- std::bad_weak_ptr
- std::pmr::memory_resource
- std::allocator
- std::pointer_traits
- std::uses_allocator
- std::uses_allocator_construction_args
- std::uninitialized_construct_using_allocator
- std::pmr::polymorphic_allocator
- std::pmr::get_default_resource
- std::pmr::set_default_resource
- std::pmr::new_delete_resource
- std::pmr::null_memory_resource
- std::pmr::synchronized_pool_resource
- std::pmr::unsynchronized_pool_resource
- std::pmr::monotonic_buffer_resource
- std::pmr::pool_options
- std::raw_storage_iterator
- std::get_temporary_buffer
- std::return_temporary_buffer
- std::uninitialized_copy
- std::uninitialized_fill
- std::uninitialized_default_construct
- std::uninitialized_copy_n
- std::uninitialized_fill_n
- std::uninitialized_move_n
- std::uninitialized_default_construct_n
- std::uninitialized_value_construct_n
- std::construct_at
- std::align
- 注é
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >卿å å管ç >ä½å±å å管ç > operator delete, operator delete[]
operator delete, operator delete[]
è§£åé å åç±å¹é ç operator new æåé çåå¨ãè¿äºè§£åé 彿°ä¸º delete 表达å¼ä¸ new è¡¨è¾¾å¼æè°ç¨ï¼ä»¥å¨ææï¼ææé å¤±è´¥ï¼æ¥æå¨æå卿ç对象åè§£åé å åãå®ä»¬äº¦å¯ç¨å¸¸è§å½æ°è°ç¨è¯æ³è°ç¨ã
ptr æ¯ç©ºæéææ¯å
åä» operator new(size_t) æ operator new(size_t, std::nothrow_t) çæ ååºå®ç°è·å¾çæéãptr æ¯ç©ºæéææ¯å
åä» operator new[](size_t) æ operator new[](size_t, std::nothrow_t) çæ ååºå®ç°è·å¾çæéã__STDCPP_DEFAULT_NEW_ALIGNMENT__ æè¢«è°ç¨__STDCPP_DEFAULT_NEW_ALIGNMENT__ æè¢«è°ç¨__STDCPP_DEFAULT_NEW_ALIGNMENT__ æè¢«è°ç¨__STDCPP_DEFAULT_NEW_ALIGNMENT__ ã__STDCPP_DEFAULT_NEW_ALIGNMENT__.operator delete åä¸å¯¹ *p æ§è¡ææå½æ°ãåè代ä¹å°ï¼åä¸ºç±æ¤ç¨æ·å®ä¹ç operator delete è´è´£ç´æ¥è°ç¨ææå½æ°ï¼ä¾å¦ç¨ p->~T(); ã|
é常ï¼éå¸ç½®ï¼è§£åé 彿°çå ·å¯¹é½åä¸å ·å¯¹é½éè½½ä¹é´çéè½½å³è®®åç¡®ç»èè§ delete 表达å¼ã |
(C++17 èµ·) |
æææ
åµä¸ï¼è¥ ptr æ¯ç©ºæéï¼åæ ååºè§£åé
彿°ä¸åä»»ä½äºãè¥ä¼ éç»æ ååºè§£åé
彿°çæé䏿¯ä»å¯¹åºçæ ååºåé
彿°åå¾è
ï¼åè¡ä¸ºæªå®ä¹ã
卿 ååºè§£åé 彿°è¿ååï¼ææå¼ç¨å°è¢«è§£åé åå¨çä»»ä½é¨åçæéé½åä¸ºéæ³ã
|
å·²å æ¤æ¹å¼åä¸ºéæ³çæéçä»»ä½ä½¿ç¨ï¼å³ä½¿æ¯å¤å¶æéå¼å°å¦ä¸æéåéï¼é½æ¯æªå®ä¹è¡ä¸ºã |
(C++14 å) |
|
éè¿å·²å æ¤æ¹å¼åä¸ºéæ³çæéè§£å¼ç¨ï¼ä»¥åå°å®ä¼ éç»è§£åé 彿°ï¼åé delete ï¼æ¯æªå®ä¹è¡ä¸ºãä»»ä½å ¶ä»ä½¿ç¨æ¯å®ç°å®ä¹çã |
(C++14 èµ·) |
åæ°
| ptr | - | æåè¦è§£åé çå ååçæéæç©ºæé |
| sz | - | ä¼ éç»å¹é çåé 彿°ç size |
| place | - | ç¨ä½å¹é çå¸ç½® new ä¸å¸ç½®åæ°çæé |
| tag | - | å¹é ä¸æåº operator new æç¨æ ç¾çéè½½æ¶æ§ä¹æ ç¾ |
| al | - | 被åé çå¯¹è±¡ææ°ç»å ç´ çå¯¹é½ |
| args | - | å¹é å¸ç½®åé 彿°çä»»æåæ°ï¼å¯å å« std::size_t ä¸ std::align_val_t ï¼ |
è¿åå¼
ï¼æ ï¼
å¼å¸¸
|
15-30) å®¹è®¸ç¨æ·å®ä¹çè§£åé
彿°æå¼å¸¸ã
|
(C++11 å) |
|
15-30) ææè§£åé
彿°å为 noexcept(true) ï¼é¤éå¨å£°æä¸å¦å¤è¯´æãè¥è§£åé
彿°ä»¥æå¼å¸¸ç»æ¢ï¼åè¡ä¸ºæªå®ä¹ï¼å³ä½¿ä»¥ noexcept(false) 声æå®ã
|
(C++11 èµ·) |
å ¨å±æ¿æ¢
坿¿æ¢è§£åé
彿° (1-10) 卿¯ä¸ªç¿»è¯åå
éå¼å£°æï¼å³ä½¿ä¸å
å« <new> 头æä»¶ãè¿äºå½æ°æ¯å¯æ¿æ¢çï¼å®ä¹äºç¨åºä»»ä½ä½ç½®ãä»»ä½å¤´æä»¶çç¨æ·æä¾çæ¥æç¸åç¾åçéæå彿°ï¼ä¼ä¸ºæ´ä¸ªç¨åºæ¿æ¢å¯¹åºçéå¼çæ¬ãå
¶å£°æä¸å¿
å¯è§ã
è¥ç¨åºä¸æä¾å¤äºä¸ä¸ªæ¿æ¢ï¼æè¥æ¿æ¢å£°ææ inline æå®ç¬¦ï¼åè¡ä¸ºæªå®ä¹ï¼è¥æ¿æ¢å£°æäºå¼äºå
¨å±å½å空é´çå½å空é´ï¼æè¥å®å®ä¹ä¸ºå¨å
¨å±ä½ç¨åç static éæå彿°ï¼åç¨åºä¸ºç
æã
|
nothrow çæ¬ (9,10) çæ ååºå®ç°ç´æ¥è°ç¨æåºçæ¬ (1,2) ãå ·å¤§å°è§£åé 彿° (5-8) çæ ååºå®ç°ç´æ¥è°ç¨å¯¹åºçä¸å ·å¤§å°è§£åé 彿° (1-4) ãä¸å ·å¤§å°çæåºæ°ç»å½¢å¼ (2,4) çæ ååºå®ç°ç´æ¥è°ç¨å¯¹åºçåå¯¹è±¡å½¢å¼ (1,3) ã æ èï¼æ¿æ¢æåºçå对象解åé 彿° (1,3) 足以å¤çææè§£åé ã |
(C++11 èµ·) |
#include <cstdio> #include <cstdlib> // 彿°æå°éçæ¿æ¢ï¼ void* operator new(std::size_t sz) { std::printf("global op new called, size = %zu\n",sz); return std::malloc(sz); } void operator delete(void* ptr) noexcept { std::puts("global op delete called"); std::free(ptr); } int main() { int* p1 = new int; delete p1;  int* p2 = new int[10]; // C++11 ä¸ä¿è¯è°ç¨æ¿æ¢è delete[] p2; }
å¯è½çè¾åºï¼
global op new called, size = 4 global op delete called global op new called, size = 40 global op delete called
operator delete ä¸ operator delete[] 带é¢å¤ç¨æ·å®ä¹åæ°çéè½½ï¼âå¸ç½®å½¢å¼âï¼ (15,16) ï¼å¯ç
§å¸¸å£°æäºå
¨å±ä½ç¨åï¼èä¸ä¸ºå¹é
çå¸ç½®å½¢å¼ new è¡¨è¾¾å¼ æè°ç¨ï¼è¥æ£å¨åé
ç对象çæé 彿°æåºå¼å¸¸ã
operator delete çæ ååºå¸ç½®å½¢å¼ (13,14) ä¸è½æ¿æ¢ï¼èä¸ä»
è¥å¸ç½® new 表达å¼ä¸ä½¿ç¨ ::new è¯æ³æè½è¢«èªå®ä¹ï¼éè¿æä¾æ¥æå¹é
ç¾åçç±»ç¹å®å¸ç½® delete (25,26) ï¼ void T::operator delete(void*, void*) æ void T::operator delete[](void*, void*) ã
ç±»ç¹å®éè½½
èåé
彿° (17-24) å¯å®ä¹ä¸ºç±»çéææå彿°ãè¥æä¾è¿äºè§£åé
彿°ï¼åå®ä»¬ä¸º delete 表达å¼å¨å 餿¤ç±»ç对象 (17,19,21) åæ°ç» (18,20,22) æ¶è°ç¨ï¼é¤é delete 表达å¼ä½¿ç¨è·³è¿ç±»ä½ç¨åæ¥æ¾çå½¢å¼ ::delete ãå
³é®è¯ static 对è¿äºå½æ°å£°ææ¯å¯éçï¼ä¸ç®¡æ¯å¦ä½¿ç¨è¯¥å
³é®è¯ï¼è§£åé
彿°é½å§ç»æ¯éææå彿°ã
delete 表达å¼ä»ç±»ä½ç¨åå¼å§æ¥æ¾éå½çè§£åé 彿°åï¼æ°ç»å½¢å¼å¨æ°ç»å ç´ ç±»çä½ç¨åæ¥æ¾ï¼ï¼ç¶åè¥æ¾ä¸å°æååç»§èç §å¸¸å¯»æ¾å ¨å±ä½ç¨åãæ³¨æï¼åæ¯ä¸ªåç§°æ¥æ¾è§åï¼ä»»ä½å£°æäºç±»ä½ç¨åçè§£åé 彿°éèææå ¨å±è§£åé 彿°ã
è¥æ£å¨å é¤ç对象çéæç±»åå¼äºå ¶å¨æç±»åï¼ä¾å¦éè¿æååºç±»çæéå é¤ä¸ä¸ªå¤æå¯¹è±¡ï¼ï¼ä¸è¥éæç±»åä¸çææå½æ°æ¯èçï¼å delete çå对象形å¼ä»å ¶èææå½æ°çæç»è¦çè çå®ä¹ç¹å¼å§æ¥æ¾è§£åé 彿°çåç§°ãæ å ³ä¹è¿è¡æ¶ä¼æ§è¡åªä¸ªææå½æ°ï¼ä¸ºäºè½å¤ç¼è¯ï¼ operator delete çéæå¯è§çæ¬å¿ é¡»å¯è®¿é®ãå ¶ä»æ åµä¸ï¼å½éè¿æååºç±»çæéå 餿°ç»ï¼æéè¿å¸¦éèææå½æ°çæéå 餿¶ï¼è¡ä¸ºæªå®ä¹ã
è¥æªæä¾ååæ°éè½½ (17,18) ï¼ä½æä¾æ¥æ¶ std::size_t 为第äºåæ°çå
·å¤§å°éè½½ (21,22) ï¼åæ£å¸¸è§£åé
è°ç¨å
·å¤§å°å½¢å¼ï¼ä¸ C++ è¿è¡æ¶ä¼ éè¦è¢«è§£åé
ç对象大å°ä¸ºç¬¬äºåæ°ãè¥å®ä¹ä¸¤ç§å½¢å¼ï¼åè°ç¨ä¸å
·å¤§å°ççæ¬ã
#include <iostream> // å ·å¤§å°çç±»ç¹å®è§£åé 彿° struct X { static void operator delete(void* ptr, std::size_t sz) { std::cout << "custom delete for size " << sz << '\n'; ::operator delete(ptr); } static void operator delete[](void* ptr, std::size_t sz) { std::cout << "custom delete for size " << sz << '\n'; ::operator delete(ptr); } }; int main() { X* p1 = new X; delete p1; X* p2 = new X[10]; delete[] p2; }
å¯è½çè¾åºï¼
custom delete for size 1 custom delete for size 18
带é¢å¤ç¨æ·å®ä¹åæ°ç operator delete ä¸ operator delete[] ï¼âå¸ç½®å½¢å¼âï¼ (25,26) ï¼äº¦å¯å®ä¹ä¸ºç±»æåãå¨å¤±è´¥çå¸ç½® new è¡¨è¾¾å¼æ¥æ¾å°è°ç¨ç对åºå¸ç½® delete 彿°æ¶ï¼å®é¦æ¬¡ä»ç±»ä½ç¨åå¼å§ï¼å¨å
¨å±ä½ç¨åä¹åæ¥æ¾ï¼å¹¶ä¸æ¥æ¾å¹é
å¸ç½® new ç¾åç彿°ï¼
#include <stdexcept> #include <iostream> struct X { X() { throw std::runtime_error(""); } // èªå®ä¹å¸ç½® new static void* operator new(std::size_t sz, bool b) { std::cout << "custom placement new called, b = " << b << '\n'; return ::operator new(sz); } // èªå®ä¹å¸ç½® delete static void operator delete(void* ptr, bool b) { std::cout << "custom placement delete called, b = " << b << '\n'; ::operator delete(ptr); } }; int main() { try { X* p1 = new (true) X; } catch(const std::exception&) { } }
è¾åºï¼
custom placement new called, b = 1 custom placement delete called, b = 1
è¥ç±»çº§å«ç operator delete æ¯æ¨¡æ¿å½æ°ï¼åå®å¿
é¡»æ¥æ void è¿åç±»åï¼é¦åæ° void* ï¼èä¸å¿
é¡»æ¥æäºä¸ªææ´å¤åæ°ãæ¢è¨ä¹ï¼åªæå¸ç½®å½¢å¼è½æ¯æ¨¡æ¿ãæ¨¡æ¿ operator delete çç¹å为模æ¿åæ°æ¨å¯¼æéæ©ã
注æ
å¨å¤æç±»ä¸è°ç¨ç±»æå®ç T::operator delete æ¯ä»
æçéè¿å¨ææ´¾åè°ç¨éææå彿°çæ
åµã
|
è¦æ±ä¸å彿°æ¯çº¿ç¨å®å ¨çï¼
对è¿äºåé æè§£åé ç¹å®åå¨åå ç彿°è°ç¨ä»¥åç¬å ¨åºåºç°ï¼å¹¶ä¸å¨æ¤é¡ºåºä¸ï¼æ¯ä¸ªè§£åé è°ç¨å åçäºä¸ä¸ªåé ï¼è¥åå¨ï¼ã |
(C++11 èµ·) |
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| LWG 2458 | C++14 | æ¾æå®äºæ¥å (void*,size_t,const nothrow_t&) çéè½½ï¼ä½å®æ æ³è¢«è°ç¨ | ç§»é¤èåéè½½ |
åé
| åé
彿° (彿°) | |
| (C++17 ä¸å¼ç¨)(C++20 ä¸ç§»é¤) |
éæ¾æªåå§ååå¨ (彿°æ¨¡æ¿) |
| è§£åé
å
å (彿°) |