簡體   English   中英

如何使用 WinAPI 和 std::make_unique 使用自定義刪除器?

[英]How to use a custom deleter using WinAPI with std::make_unique?

所以我只是在試驗智能指針以及如何用它們管理 Win32 HANDLE對象,所以我想測試我編寫的這個簡單代碼。

它應該為std::unique_ptr提供一個自定義刪除器,以便在智能指針離開 scope 時使用。

template <typename Function>
class PtrDeleter
{
    Function _Closer;
public:
    void operator()(void* memBlock) const
    {
        _Closer(memBlock);
    }
};

//The std::make_unique is the one causing the problem...
std::unique_ptr<void*, PtrDeleter<decltype(CloseHandle)>> ptr = std::make_unique<void*>(OpenThread(...));

我為Function參數使用模板的原因是因為我將在CloseHandle中使用其他函數,例如CoTaskMemFree

無法從 std::unique_ptr<void *,std::default_delete<_Ty>>' 轉換為 'std::unique_ptr<void *,PtrDeleter<BOOL (HANDLE)>>

這就是編譯器輸出的內容。 為什么它仍在嘗試將std::default_deletestd::make_unique使用?

make_unique返回帶有默認刪除器的unique_ptr

要提供您的自定義版本,您必須調用unique_ptr(Pointer,Deleter)版本的unique_ptr ctor:

template <typename Function>
class PtrDeleter {
    Function _Closer;
public:
    void operator()(void* memBlock) const {
        _Closer(memBlock);
    }
};

int main() {
    PtrDeleter<decltype(&CloseHandle)> deleter;
    void* openThread = OpenThread(0,false,0);
    std::unique_ptr<void, decltype(deleter)> ptr(openThread,deleter);
}

演示

std::make_unique無法使用自定義刪除器生成std::unique_ptr 您必須手動調用其構造函數。

std::unique_ptr<void*, PtrDeleter<decltype(&CloseHandle)>> ptr{nullptr, CloseHandle}

在您的情況下,它可以簡化為

std::unique_ptr<void*,decltype(&CloseHandle)> ptr{nullptr, CloseHandle}

無需制作函子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM