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...