数组和普通指针之间的区别与std :: unique_ptr

时间:2014-09-23 21:43:01

标签: c++ visual-studio-2010 c++11

有:

std::unique_ptr< double> d( new double[3] );

std::unique_ptr< double[]> darr( new double[3] );

两者之间的差异中至少有一个似乎是后来的调用delete[],但两者都是有效的......但是为什么会这样?我的意思是如何在第一种情况下删除内存,是不是使用delete删除数组的未定义行为?

其次,我知道上面的darr已定义[]运算符但如何访问d的第2和第3个成员,因为没有定义[]运算符。

为什么有人会使用第一种语法而不是第二种语法?

2 个答案:

答案 0 :(得分:4)

std::unique_ptr

template <
    class T,
    class Deleter
> class unique_ptr<T[], Deleter>;
  

管理动态分配的对象数组的生命周期(例如,使用new []分配)。

不幸的是,表达式std::unique_ptr<double>(new double[3])在没有警告或错误的情况下编译,最终将new[]分配用delete(标量版本)处理,导致在运行时导致未定义的行为。

您可以使用std::vector<double>(3)自动分配和处理阵列。

答案 1 :(得分:1)

  

两者之间的差异中至少有一个似乎是后来调用delete []但两者都有效..

第一个无效。内存必须分配new,而不是new[]。它编译的唯一原因是因为第一种语法需要double*作为输入而double[]会降级为double*

  

我的意思是如何在第一种情况下删除内存

使用delete,而不是delete[]

  

是不是删除带删除数组的未定义行为?

  

其次我知道darr上面有[]运算符定义但是如何访问d的第2和第3个成员,因为没有定义[]运算符。

您必须使用其get()方法来访问基础指针,例如:

double value = d.get()[1]
  

为什么有人会使用第一种语法而不是第二种语法?

没有人应该成为数组的第一个语法。第二种语法专门为数组添加。