【问题标题】:Why don't I get destructors called when using unique_ptr? [duplicate]为什么我在使用 unique_ptr 时没有调用析构函数? [复制]
【发布时间】:2020-11-03 21:43:52
【问题描述】:

在这里,我正在创建动态分配的 S 对象数组,我希望它们被 unique_ptr 销毁,这不会发生,我收到此错误

命令被信号 11 终止

这意味着程序访问了我认为不应该访问的内存。

#include <iostream>
#include <memory>

class S{
    public:
        S(){std::cout<<"Constructor\n";}
        ~S(){std::cout<<"Destructor\n";}
};

int main() {
    S* arr=new S[4];
    {
        using namespace std;
        unique_ptr<S> ptr=unique_ptr<S>(arr);
    }
}

【问题讨论】:

  • std::unique_ptr&lt;S&gt; 将假定它正在管理单个对象并有效地执行delete arr。由于arr 是使用运算符new 的数组形式初始化的,因此行为未定义。
  • 我建议您不要使用newnew[] 手动分配内存,而是使用make_unique。在这种情况下,您应该只使用auto arr = make_unique&lt;S[]&gt;(4);
  • @ErikNouroyan 类似,但 Nikos 的答案是异常安全的,而 KamilCuk 则不是。

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


【解决方案1】:
new s[4]

如果您使用new[] 分配,您必须使用delete[] 来销毁它,而不是delete

    auto ptr = unique_ptr<S[]>(arr);

【讨论】:

  • 感谢您的回答,如果我忽略了这一点,我能知道我的情况会发生什么吗?我的意思是内部发生了什么?
  • in my case if I ommit that? 未定义的行为。 I mean what happens internally? 不知道,你必须阅读你的标准库实现的源代码。
  • @ErikNouroyan 当您有未定义的行为时,您无法真正争论为什么会发生或不会发生某些事情。在这种情况下,int 可能是一个基本类型并且没有析构函数。但实际上,这并不重要。
  • @TedLyngmo 我猜这就是所需要的,您拥有该对象的所有权,并且由于它是 S[] 类型,因此当超出范围时,将调用 unique_ptr 的析构函数,它的作用类似于此删除[]
  • @TedLyngmo 没关系
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2011-04-18
  • 2012-06-29
  • 2021-06-21
  • 1970-01-01
相关资源
最近更新 更多