【问题标题】:How to use unique_ptr for arrays如何将 unique_ptr 用于数组
【发布时间】:2014-07-24 11:19:27
【问题描述】:

我有课

class A {
public:
  A(){cout<<"C";}
  ~A(){cout<<"D";}
};
int main(){
  unique_ptr<A> a(new A[5]); // - doesn't work 
  unique_ptr<A> a(new A[1]); // - doesn't work
  unique_ptr<A> a(new A); // - works
}

为什么会这样?

我猜是关于移动构造函数(因为析构函数不能自动创建),但是为什么我们这里需要移动构造函数呢?

和有什么区别:

unique_ptr<A> a(new A[1]); // - doesn't work
unique_ptr<A> a(new A); // -works

【问题讨论】:

  • 你明白AA[]的区别吗?
  • 永远写“不起作用”,那没用。要么编译失败(什么错误消息?),要么崩溃(根据调试器在哪里?),或者它产生了意外的结果(哪个,以及预期的结果?),等等。
  • 问题标题太可怕了。

标签: c++ unique-ptr move-constructor


【解决方案1】:

要将unique_ptr 与数组分配一起使用,您需要使用它的特化:

unique_ptr<A[]> a(new A[5]);

【讨论】:

  • 我知道,但我只是想知道当我从 A 类中删除析构函数时,为什么这段代码有效。
  • 不会,因为不是所有的析构函数都会被调用。
  • 我刚刚用带注释的析构函数尝试了这段代码,它打印出“CCCCC”
  • 我关于不工作的评论不是关于构造函数,而是关于unique_ptr 超出范围时的析构函数。
  • 因为用delete(而不是delete[])删除用new[] 分配的对象会导致未定义的行为。除此之外,它对你来说应该不重要。
猜你喜欢
  • 2012-02-19
  • 2021-11-16
  • 2017-05-12
  • 1970-01-01
  • 2021-10-09
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多