为什么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);


以上是为什么unique_ptr&lt;T&gt;不能从T*构造?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>