Why?

Write and forgot it, 别再纠结这个free那个close了

smart_ptr.h

#pragma once
#include <memory>
#include <functional>

template <typename T>
using unique_ptr_dl = std::unique_ptr< std::remove_pointer_t<T>, std::function<void(T)>>;

template <typename T>
unique_ptr_dl<T> make_unique_ptr(T ptr, std::function<void(T)> deleter) {
    return unique_ptr_dl<T>(ptr, deleter);
}

template <typename T>
using shared_ptr_dl = std::shared_ptr<std::remove_pointer_t<T>>;

template <typename T>
shared_ptr_dl<T> make_shared_ptr(T ptr, std::function<void(T)> deleter) {
    return shared_ptr_dl<T>(ptr, deleter);
}

Examples

#include "smart_ptr.h"
#include <Windows.h>

auto pBuffer1 = make_unique_ptr<BYTE*>( static_cast<BYTE*>(malloc(1024)), [](BYTE* p) { free(p); } );
auto pBuffer2 = make_shared_ptr<BYTE*>( static_cast<BYTE*>(malloc(1024)), [](BYTE* p) { free(p); } );

auto pHandle  = make_unique_ptr<HANDLE>( CreateFile(...), [](HANDLE p) { CloseHandle(p); } );
// And more...