独特的ptr初始化断言失败

时间:2014-10-22 11:56:25

标签: c++ smart-pointers unique-ptr

这导致我的程序断言失败:

int a = 5;
std::unique_ptr<int>intptr(&a);

错误

  

文件:f:\ dd \ vctools \ crt \ crtw32 \ misc \ dbgdel.cpp

     

行:32

     

表达式:_BLOCK_TYPE_IS_VALID(pHead&gt; nBlockUse)

使用&#34; new&#34;进行初始化时效果很好或&#34; = make_unique(..)&#34;但我很想知道为什么我可以通过给出现有变量的地址来初始化它。

4 个答案:

答案 0 :(得分:2)

您可以初始化。错误是unique_ptr的破坏,因为默认情况下它是delete所有者指针。您应该使用new创建,或使用客户删除。

答案 1 :(得分:2)

变量a在堆栈上,如果将其绑定到unique_ptr,当unique_ptr超出范围时,它将对无法删除的变量调用delete。

基本上你不能获得自动存储变量的所有权,只能获得动态存储变量。

答案 2 :(得分:2)

可以使用这样的自定义删除器将unique_ptr初始化为自动变量:

auto noop = [](int*){};
std::unique_ptr<int, decltype(noop)>intptr(&a, noop);

请记住不要让指针逃离自动变量所在的范围。

但是在这里使用unique_ptr可能没有任何意义,所以你可能想重新考虑你的方法。

答案 3 :(得分:1)

只有当你有一些奇怪的自定义删除程序对实际销毁没有任何作用时,你才可以使用地址。

struct D{

    void operator()(int* p) const {
        std::cout << "Deleter \n";
        //... no actual delete
    }
};  

int a =5;    
std::unique_ptr<int,D> intptr (&a);