Простой код для использования unique_ptr
или shared_ptr
в качестве охраны области. Вся информация о том, что нужно очистить, содержится в deleter
, поэтому я уверен, что для конструктора безопасно использовать nullptr
.
Очевидно, что в Visual C ++ 2017 (14.1) он не работает должным образом для unique_ptr
, но работает для shared_ptr
. Это выдумка Microsoft или стандарт запрещает вызывать deleter
из unique_ptr
при удержании nullptr
?
В приведенном ниже коде я вынужден создать unique_ptr
с (void*)1
. Если я построю это с nullptr
, cleaner
не будет вызван. Для shared_ptr
разницы нет, всегда вызывается cleaner
.
#include <memory>
#include <iostream>
int main()
{
int ttt = 77;
auto cleaner = [&ttt](void*) {
std::cout << "cleaner: " << ttt << "\n"; // do something with capture here instead of print
};
std::unique_ptr<void, decltype(cleaner)> p((void*)1, cleaner);
std::shared_ptr<void> q(nullptr, [&ttt](void*) {
std::cout << "shared: " << ttt << "\n"; // do something with capture here instead of print
});
std::cout << "done\n";
return 0;
}