Проверьте следующую изобретенную программу:
#include <functional>
#include <memory>
template<typename T>
using UniPtr = std::unique_ptr<T, std::function<void(T*)>>;
int* alloc()
{
return new int;
}
UniPtr<int> func()
{
auto dealloc = [](int* p){delete p;};
return UniPtr<int>{alloc(), dealloc};
}
int main()
{
auto p = func();
return 0;
}
Из руководства по построению std :: function , я думаю, создание объекта std::function
может вызвать исключение, даже если отношение очень низкое:
UniPtr<int> func()
{
auto dealloc = [](int* p){delete p;};
return UniPtr<int>{alloc(), dealloc};
}
Но, если вместо std::function
используется указатель на функцию:
template<typename T>
using UniPtr = std::unique_ptr<T, void(*)(T*)>;
Я думаю, что после выхода из области действия func()
объект dealloc
должен быть освобожден, и на него нельзя ссылаться. Пожалуйста, поправьте меня, если я ошибаюсь. Таким образом, единственный безопасный метод, который я могу предложить, - это определение глобальной dealloc
функции:
void dealloc(int* p)
{
delete p;
}
Но мне не нравится этот метод.
Исходя из изложенного выше, не существует 100% безопасного способа использования lambda
в качестве std :: unique_ptr Deleter , или я что-то неправильно понимаю? Как использовать lambda
как std::unique_ptr
s Deleter
?