为什么unique_ptr<T>不能从T*构造?
举个简单的例子,这段代码有什么“错误”?
unique_ptr<char> meow = strdup("meow");
无论我是否向unique_ptr模板提供“deleter”参数,unique_ptr<T>都不能从T*.
为什么不<memory>提供这种看似直观的快捷方式?这仅仅是一个疏忽,还是出于某种原因,这种可分配性是一个根本坏的主意?
回答
为什么不
<memory>提供这种看似直观的快捷方式?
想象你有
int bar;
{
int * foo = &bar;
std::unique_ptr<int> uptr = foo;
// use uptr
}
当uptr超出范围时,它将尝试并执行delete pointer;,这将尝试调用delete未由 分配的内存new。这是未定义的行为,可能会导致各种问题。标准不允许编写这样的错误代码,而不是允许它。
如果您真的确定unique_ptr要从现有指针构造一个,并且您知道默认删除器就是您想要的,那么您可以使用以下形式
auto pointer_name = std::unique_ptr<type>(pointer_i_know_needs_to_be_deleted);