【问题标题】:unique ptr initialisation assertion failure唯一 ptr 初始化断言失败
【发布时间】:2014-12-17 20:55:10
【问题描述】:

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

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

错误

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

行:32

表达式:_BLOCK_TYPE_IS_VALID(pHead > nBlockUse)

当我使用“new”或“= make_unique (..)”初始化它时效果很好,但我很想知道为什么我不能通过给出现有变量的地址来初始化它。

【问题讨论】:

  • 您不能从堆栈分配或释放内存。由于a 已在堆栈中声明,因此您无法删除它,这是您的unique_ptr 在超出范围时尝试执行的操作。
  • 出于兴趣,您想在这里达到什么目的?
  • doctorlove -> 没什么,我只是为了学习而尝试一些东西
  • 出于学习目的,在 C++ 中使用堆越少越好。

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


【解决方案1】:

变量a在栈上,如果绑定到unique_ptr,当unique_ptr超出作用域时,会对不能删除的变量调用delete。

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

【讨论】:

    【解决方案2】:

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

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

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

    但在这里使用unique_ptr 可能根本没有任何意义,因此您可能需要重新考虑您的方法。

    【讨论】:

      【解决方案3】:

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

      struct D{
      
          void operator()(int* p) const {
              std::cout << "Deleter \n";
              //... no actual delete
          }
      };  
      
      int a =5;    
      std::unique_ptr<int,D> intptr (&a);
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-09
          • 2021-04-26
          • 2017-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-07
          • 1970-01-01
          相关资源
          最近更新 更多