std::default_delete
來自 cppreference.com
定義於標頭檔案 <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 在未指定刪除器時使用的預設銷燬策略。default_delete
的特化在典型實現中是空類,並用於空基類最佳化。
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) | (C++11 起) (C++23 起為 constexpr) |
陣列特化 |
||
template< class U > default_delete( const default_delete<U[]>& d ) noexcept; |
(3) | (C++11 起) (C++23 起為 constexpr) |
1) 構造一個
std::default_delete
物件。2) 從另一個
std::default_delete
物件構造一個 std::default_delete<T>
物件。 此過載僅當
U*
可隱式轉換為 T*
時才參與過載決議。3) 從另一個
std::default_delete<U[]>
物件構造一個 std::default_delete<T[]>
物件。 此過載僅當
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++11 起) (C++23 起為 constexpr) |
陣列特化 |
||
template< class U > void operator()( U* ptr ) const; |
(2) | (C++11 起) (C++23 起為 constexpr) |
1) 對 ptr 呼叫 delete。
2) 對 ptr 呼叫 delete[]。
此過載僅當
U(*)[]
可隱式轉換為 T(*)[]
時才參與過載決議。 如果
U
是不完整型別,則程式非良構。引數
ptr | - | 要刪除的物件或陣列 |
異常
無異常保證。
[編輯] 對不完整型別呼叫
在呼叫 operator() 的程式碼點,型別必須是完整的。在某些實現中,使用 static_assert 來確保這一點。此要求的原因是,如果完整類型別具有非平凡解構函式或解除分配函式,則在 C++ 中對不完整型別呼叫 delete 是未定義行為,因為編譯器無法知道是否存在此類函式以及是否必須呼叫它們。
[編輯] 注意
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__cpp_lib_constexpr_memory |
202202L |
(C++23) | constexpr 建構函式和 operator() |
[編輯] 示例
執行此程式碼
#include <algorithm> #include <memory> #include <vector> int main() { // { // std::shared_ptr<int> shared_bad(new int[10]); // } // the destructor calls delete, undefined behavior { std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>()); } // OK: the destructor calls delete[] { std::unique_ptr<int> ptr(new int(5)); } // unique_ptr<int> uses default_delete<int> { std::unique_ptr<int[]> ptr(new int[10]); } // unique_ptr<int[]> uses default_delete<int[]> // default_delete can be used anywhere a delete functor is needed 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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2118 | C++11 | 陣列特化的成員函式拒絕限定轉換 | 接受 |
[編輯] 另請參閱
(C++11) |
具有唯一物件所有權語義的智慧指標 (類模板) |