名稱空間
變體
操作

std::default_delete

來自 cppreference.com
< cpp‎ | 記憶體
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(C++17)
(C++17)
(C++17)
受約束的未初始化
記憶體演算法
C 庫

分配器
記憶體資源
垃圾回收支援
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化儲存
(直到 C++20*)
(直到 C++20*)
顯式生命週期管理
 
定義於標頭檔案 <memory>
template< class T > struct default_delete;
(1) (C++11 起)
template< class T > struct default_delete<T[]>;
(2) (C++11 起)

std::default_deletestd::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 陣列特化的成員函式拒絕限定轉換 接受

[編輯] 另請參閱

具有唯一物件所有權語義的智慧指標
(類模板) [編輯]