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 new, operator new[]
operator new, operator new[]
[[nodiscard]]
|
noexcept |
(C++11 èµ·) |
|
[[nodiscard]] |
(C++20 èµ·) |
           std::align_val_t al, const std::nothrow_t&);
           std::align_val_t al, const std::nothrow_t&);
|
noexcept |
(C++11 èµ·) |
|
[[nodiscard]] |
(C++20 èµ·) |
           std::align_val_t al, user-defined-args... );
           std::align_val_t al, user-defined-args... );
             std::align_val_t al, user-defined-args... );
             std::align_val_t al, user-defined-args... );
åé è¯·æ±æ°éçåèãè¿äºåé 彿°ä¸º new è¡¨è¾¾å¼æè°ç¨ï¼ä»¥åé å°è¢«åå§åç对象æå¨çå åã亦å¯ç¨å¸¸è§å½æ°è°ç¨è¯æ³è°ç¨å®ä»¬ã
count åèã失败æ
åµä¸ï¼æ ååºå®ç°è°ç¨ std::get_new_handler æè¿åç彿°æéï¼å¹¶éå¤å°è¯åé
ï¼ç´å° new å¤ç彿°ä¸è¿åææä¸ºç©ºæéï¼å¨è¯¥æ¶å»æåº std::bad_alloc ãè¦æ±æ¤å½æ°è¿åæåæ¥æè¯·æ±å¤§å°ç对象çéå½å¯¹é½çæéã__STDCPP_DEFAULT_NEW_ALIGNMENT__ çå个对象æè¦æ±çåå¨__STDCPP_DEFAULT_NEW_ALIGNMENT__ ç对象æ°ç»è¦æ±çææåå¨__STDCPP_DEFAULT_NEW_ALIGNMENT__ æ¶ä¸ºä¸æåºéæ°ç» new è¡¨è¾¾å¼æè°ç¨ãæ ååºå®ç°è°ç¨çæ¬ (3) å¹¶å¨å¤±è´¥æ¶ä¸ä¼ æå¼å¸¸èæåºç©ºæéã__STDCPP_DEFAULT_NEW_ALIGNMENT__ æ¶ä¸º new[] 表达å¼çä¸æåºæ°ç»å½¢å¼æè°ç¨ãæ ååºå®ç°è°ç¨çæ¬ (4) å¹¶å¨å¤±è´¥æ¶ä¸ä¼ æå¼å¸¸èæåºç©ºæéãptr ãè¥éè¿å¸ç½® new 表达å¼è°ç¨æ¤å½æ°è ptr 为空æéåè¡ä¸ºæªå®ä¹ãptr ãè¥éè¿å¸ç½® new 表达å¼è°ç¨æ¤å½æ°è ptr 为空æéåè¡ä¸ºæªå®ä¹ã__STDCPP_DEFAULT_NEW_ALIGNMENT__ ãè¥å®ä¹ç±»ç¹å®çæ¬ï¼ (15) æ (17) ï¼ï¼åè°ç¨ä¹ãè¥æ¢ä¸æä¾ç±»ç¹å®çæ¬å䏿ä¾å
·å¯¹é½å¸ç½®å½¢å¼ï¼æ¤å½¢å¼ï¼ï¼åæ¿èæ¥æ¾æ 对é½å¸ç½®å½¢å¼ (11) ã__STDCPP_DEFAULT_NEW_ALIGNMENT__ ãè¥å®ä¹ç±»ç¹å®çæ¬ï¼(16) æ (18) ï¼ï¼åè°ç¨ä¹ãè¥æ¢ä¸æä¾ç±»ç¹å®çæ¬å䏿ä¾å
·å¯¹é½å¸ç½®å½¢å¼ï¼æ¤å½¢å¼ï¼ï¼åæ¿èæ¥æ¾æ 对é½å¸ç½®å½¢å¼ (12) ã__STDCPP_DEFAULT_NEW_ALIGNMENT__ ãè¥ä¸æä¾æ¤éè½½ï¼ä½æä¾äºæ 坹齿åå½¢å¼ (15) ï¼åè°ç¨æ 坹齿åéè½½ã__STDCPP_DEFAULT_NEW_ALIGNMENT__ ãè¥ä¸æä¾æ¤éè½½ï¼ä½æä¾äºæ 坹齿åå½¢å¼ (16) ï¼åè°ç¨æ 坹齿åéè½½ã__STDCPP_DEFAULT_NEW_ALIGNMENT__ ãè¥ä¸æä¾æ¤éè½½ï¼ä½æä¾äºæ 坹齿åå½¢å¼ (19) ï¼åè°ç¨æ 坹齿åéè½½ã__STDCPP_DEFAULT_NEW_ALIGNMENT__ ãè¥ä¸æä¾æ¤éè½½ï¼ä½æä¾äºæ 坹齿åå½¢å¼ (20) ï¼åè°ç¨æ 坹齿åéè½½ãåæ°
| count | - | è¦åé çåèæ° |
| ptr | - | æåè¦åå§åç对象æå¨çå ååºåçæé |
| tag | - | ç¨äºéæ©ä¸æåºéè½½çæ¶æ§ä¹æ ç¾ |
| al | - | 使ç¨ç对é½ãè¥æ¤éææå¯¹é½å¼ï¼åè¡ä¸ºæªå®ä¹ |
è¿åå¼
size 大å°çéå½å¯¹é½çå
åsize 大å°çéå½å¯¹é½çå
åï¼æå¨å¤±è´¥æ¶ä¸ºç©ºæéptrå¼å¸¸
å ¨å±æ¿æ¢
çæ¬ (1-4) 卿¯ä¸ªç¿»è¯åå
éå¼å£°æï¼å³ä½¿ä¸å
å« <new> 头æä»¶ãçæ¬ (1-8) æ¯å¯æ¿æ¢çï¼å®ä¹äºç¨åºä»»ä½ä½ç½®ï¼å¨ä»»ä½æºæä»¶çç¨æ·æä¾çæ¥æç¸åç¾åçéæå彿°ï¼ä¼æ¿æ¢é»è®¤çæ¬ãå
¶å£°æä¸å¿
å¯è§ã
è¥ç¨åºä¸ä¸ºä»»ä½å¯æ¿æ¢åé
彿°æä¾å¤äºä¸ä¸ªæ¿æ¢çæ¬ï¼æè¥æ¿æ¢å®ä¹å¸¦ inline æå®ç¬¦ï¼åè¡ä¸ºæªå®ä¹ãè¥æ¿æ¢å®ä¹äºå¼äºå
¨å±å½å空é´çå½å空é´ä¸ï¼æå®å®ä¹ä¸ºå¨å
¨å±ä½ç¨åç static 彿°ï¼åç¨åºä¸ºç
å¼ã
|
nothrow çæ¬çæ ååºå®ç° (5-8) ç´æ¥è°ç¨å¯¹åºçæåºçæ¬ (1-4) ãæåºçæ°ç»çæ¬çæ ååºå®ç° (2,4) ç´æ¥è°ç¨å¯¹åºçåå¯¹è±¡çæ¬ (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); void *ptr = std::malloc(sz); if (ptr) return ptr; else throw std::bad_alloc{}; } 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 new ä¸ operator new[] 带é¢å¤ç¨æ·å®ä¹åæ°çéè½½ï¼âå¸ç½®å½¢å¼âï¼çæ¬ (11-14) ï¼å¯ä»¥ç
§å¸¸å£°æäºå
¨å±ä½ç¨äºï¼èä¸ä¸ºå¹é
ç new 表达å¼çå¸ç½®å½¢å¼æè°ç¨ã
æ ååºç operator new çä¸åé
å¸ç½®å½¢å¼ (9-10) ä¸è½è¢«æ¿æ¢ï¼èä¸åªè¥å¸ç½® new 表达å¼ä¸ä½¿ç¨ ::new è¯æ³æè½èªå®ä¹ï¼éè¿æä¾ç±»ç¹å®ç带å¹é
ç¾åçå¸ç½® new (19,20) ï¼ void* T::operator new(size_t, void*) æ void* T::operator new[](size_t, void*) ã
|
å¸ç½®å½¢å¼ |
(C++14 èµ·) |
ç±»ç¹å®éè½½
åå¯¹è±¡åæ°ç»åé
彿°é½å¯ä»¥å®ä¹ä¸ºç±»çå
¬å¼éææå彿°ï¼çæ¬ (15-18) ãè¥å®ä¹ï¼å new 表达å¼è°ç¨è¿äºå½æ°ï¼ä»¥åé
æ¤ç±»åä¸ªå¯¹è±¡ææ°ç»çå
åï¼é¤é new 表达å¼ä½¿ç¨ ::new å½¢å¼ï¼è¿è·³è¿ç±»ä½ç¨åæ¥æ¾ãå
³é®è¯ static 对è¿äºå½æ°å¯éï¼ä¸ç®¡æ¯å¦ä½¿ç¨ï¼åé
彿°é½æ¯éææå彿°ã
new 表达å¼é¦å å¨ç±»ä½ç¨å䏿¥æ¾éå½ç彿°åï¼ç¶åå¨å ¨å±ä½ç¨åæ¥æ¾ã注æï¼åæ¯ä¸ªåç§°æ¥æ¾è§åï¼å°±è¯å¾åé æ¤ç±»å¯¹è±¡ç new 表达å¼èè¨ï¼ä»»ä½å£°æäºç±»ä½ç¨åçåé 彿°éèææå ¨å±åé 彿°ã
|
å¨åé
对é½è¶
åº |
(C++17 èµ·) |
#include <iostream> // ç±»ç¹å®åé 彿° struct X { static void* operator new(std::size_t sz) { std::cout << "custom new for size " << sz << '\n'; return ::operator new(sz); } static void* operator new[](std::size_t sz) { std::cout << "custom new for size " << sz << '\n'; return ::operator new(sz); } }; int main() { X* p1 = new X; delete p1; X* p2 = new X[10]; delete[] p2; }
å¯è½çè¾åºï¼
custom new for size 1 custom new for size 10
operator new ä¸ operator new[] 带é¢å¤ç¨æ·å®ä¹åæ°ï¼âå¸ç½®å½¢å¼âï¼çéè½½ï¼äº¦å¯å®ä¹ä¸ºç±»æå (19-22) ã卿¥æå¹é
ç¾åçå¸ç½® new è¡¨è¾¾å¼æ¥æ¾è¦è°ç¨ç对åºåé
彿°æ¶ï¼æ¥æ¾å¨æ£éªå
¨å±ä½ç¨ååï¼ä»ç±»ä½ç¨åå¼å§ï¼èè¥æä¾äºç±»ç¹å®çå¸ç½® new åè°ç¨å®ã
|
å¨åé
对é½è¶
åº |
(C++17 èµ·) |
#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 new æ¯æ¨¡æ¿å½æ°ï¼åå®å¿
é¡»æ¥æè¿åç±»å void* ï¼ç¬¬ä¸åæ°ç±»å std::size_t ï¼ä¸å®å¿
é¡»æ¥æäºä¸ªææ´å¤åæ°ãæ¢è¨ä¹ï¼ä»
å¸ç½®å½¢å¼è½æ¯æ¨¡æ¿ã
注解
尽管ä¸åé
å¸ç½® new (9,10) ä¸è½è¢«æ¿æ¢ï¼äº¦å¯å¨ä¸é¢æè¿°çç±»ä½ç¨åå®ä¹æ¥æç¸åç¾åç彿°ãèä¸ï¼åæ¯å¸ç½® new 使¥åé void æéç±»åä½ä¸ºç¬¬äºåæ°çå
¨å±éè½½æ¯çåå°å
许çï¼æ
æå¾ç¡®ä¿è°ç¨ççå¸ç½® new ç代ç ï¼ä¾å¦ std::allocator::construct ï¼å¿
é¡»ä½¿ç¨ ::new å¹¶å°æé转åå° void* ã
|
è¦æ±ä¸å彿°æ¯çº¿ç¨å®å ¨çï¼
对è¿äºåé æè§£åé ç¹å®åå¨åå ç彿°è°ç¨ä»¥åç¬å ¨åºåºç°ï¼å¹¶ä¸å¨æ¤é¡ºåºä¸ï¼æ¯ä¸ªè§£åé è°ç¨å åçäºä¸ä¸ªåé ï¼è¥åå¨ï¼ã |
(C++11 èµ·) |
operator new çåºçæ¬æ¯å¦äº§çä»»ä½å¯¹ std::malloc æ std::aligned_alloc (C++17 èµ·) çè°ç¨æ¯æªæå®çã
示ä¾
| æ¬èæªå®æ åå ï¼ææ ç¤ºä¾ |
åé
| è§£åé
彿° (彿°) | |
| (C++11) |
è·å¾å½åç new å¤ç彿° (彿°) |
| 注åä¸ä¸ª new å¤ç彿° (彿°) | |
| (C++17 ä¸å¼ç¨)(C++20 ä¸ç§»é¤) |
è·å¾æªåå§ååå¨ (彿°æ¨¡æ¿) |
| åé
å
å (彿°) | |
| (C++17) |
åé
对é½çå
å (彿°) |
å¼ç¨
- C++11 standard (ISO/IEC 14882:2011):
- 18.6 Dynamic memory management [support.dynamic]