C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- 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::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 å å管çåº
- ä½å±å å管ç
- 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++ åèæå >卿å å管ç > std::default_delete
std::default_delete
| å®ä¹äºå¤´æä»¶ <memory>
|
||
| template< class T > struct default_delete; |
(1) | (C++11 èµ·) |
| template< class T > struct default_delete<T[]>; |
(2) | (C++11 èµ·) |
std::default_delete æ¯ä¸æå®å é¤å¨æ¶ std::unique_ptr æç¨çé»è®¤å é¤çç¥ã
1) éç¹åç default_delete ç¨ delete è§£åé
å个对象çå
åã
2) 亦为æä¾æ°ç»ç±»åçä½¿ç¨ delete[] çé¨åç¹åã
æå彿°
| (æé 彿°) |
æé default_delete 对象 (å ¬å¼æå彿°) |
| operator() |
å é¤å¯¹è±¡ææ°ç» (å ¬å¼æå彿°) |
std::default_delete::default_delete
| constexpr default_delete() noexcept = default; |
(1) | |
| template <class U> default_delete( const default_delete<U>& d ) noexcept; |
(2) | (ä»
为åç default_delete 模æ¿çæå) |
| template<class U> default_delete( const default_delete<U[]>& d) noexcept; |
(3) | (C++17 èµ·) (ä» ä¸ºæ°ç» default_delete ç¹åçæå) |
std::default_delete 对象ãstd::default_delete æé std::default_delete å¯¹è±¡ãæ¤æé 彿°ä»
è¥ U* å¯éå¼è½¬æ¢ä¸º T* æåä¸éè½½å³è®®ãstd::default_delete<U[]> 对象æé std::default_delete<U[]> å¯¹è±¡ãæ¤æé 彿°ä»
è¥ U(*)[] å¯éå¼è½¬æ¢ä¸º T(*)[] æåä¸éè½½å³è®®ãåæ°
| d | - | å¤å¶æ¥æºçå é¤å¨ |
注æ
std::default_delete çè½¬æ¢æé 彿°æ¨¡æ¿ä»¤ä» std::unique_ptr<Derived> å° std::unique_ptr<Base> çéå¼è½¬æ¢å¯è¡ã
std::default_delete::operator()
| void operator()(T* ptr) const; |
(1) | (C++17 èµ·ï¼ä¸åæ¯ default_delete<T[]> 模æ¿ç¹åçæå) |
| template <class U> void operator()(U* ptr) const; |
(2) | (ä»
为 default_delete<T[]> 模æ¿ç¹åçæåï¼ä½ C++17 åå®ä¹ä¸ºè¢«å é¤) |
|
1) å¨
ptr ä¸è°ç¨ delete ï¼åçæ¨¡æ¿ï¼æ delete[] ï¼æ°ç»ç¹åï¼ã2) å®ä¹ä¸ºè¢«å é¤ã
|
(C++17 å) |
|
1) å¨
ptr ä¸è°ç¨ delete ã2) å¨ ptr ä¸è°ç¨ delete[] ãæ¤å½æ°ä»
è¥ U(*)[] è½éå¼è½¬æ¢ä¸º T(*)[] æåä¸éè½½å³è®®ã
|
(C++17 èµ·) |
任使 åµä¸ï¼è¥ U æ¯ä¸å®æ´ç±»åï¼åç¨åºä¸ºç å¼ã
åæ°
| ptr | - | è¦å é¤çå¯¹è±¡ææ°ç» |
å¼å¸¸
æ å¼å¸¸ä¿è¯ã
å¨ä¸å®æ´ç±»åä¸è°ç¨
äºä»£ç ä¸è°ç¨ operator() ç¹ï¼ç±»åå¿
须宿´ãä¸äºå®ç°ä¸ç¨ static_assert ç¡®ä¿å¦æ¤ãæ¤è¦æ±çåå ï¼æ¯ C++ ä¸è¥å®æ´ç±»ç±»åæ¥æé平塿æå½æ°æè§£åé
彿°ï¼åå¨ä¸å®æ´ç±»åä¸è°ç¨ delete æ¯æªå®ä¹è¡ä¸ºï¼å 为ç¼è¯å¨æ æ³å¾ç¥è¿ç§å½æ°æ¯å¦åå¨ä¸å¿
须被è°ç¨ã
示ä¾
#include <memory> #include <vector> #include <algorithm>  int main() { // { // std::shared_ptr<int> shared_bad(new int[10]); // } // ææå½æ°è°ç¨ delete ï¼æªå®ä¹è¡ä¸º  { std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]> ()); } // ææå½æ°è°ç¨ delete[] ï¼ ok  { std::unique_ptr<int> ptr(new int(5)); } // unique_ptr<int> ä½¿ç¨ default_delete<int>  { std::unique_ptr<int[]> ptr(new int[10]); } // unique_ptr<int[]> ä½¿ç¨ default_delete<int[]>  // default_delete è½ç¨äºéè¦å é¤ç¨å½æ°å¯¹è±¡çä»»ä½åºæ std::vector<int*> v; for(int n = 0; n < 100; ++n) v.push_back(new int(n)); std::for_each(v.begin(), v.end(), std::default_delete<int>()); }
åé
| (C++11) |
æ¥æç¬æå¯¹è±¡æææè¯ä¹çæºè½æé (类模æ¿) |