有:
std::unique_ptr< double> d( new double[3] );
和
std::unique_ptr< double[]> darr( new double[3] );
两者之间的差异中至少有一个似乎是后来的调用delete[]
,但两者都是有效的......但是为什么会这样?我的意思是如何在第一种情况下删除内存,是不是使用delete
删除数组的未定义行为?
其次,我知道上面的darr
已定义[]
运算符但如何访问d
的第2和第3个成员,因为没有定义[]
运算符。
为什么有人会使用第一种语法而不是第二种语法?
答案 0 :(得分:4)
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]
为什么有人会使用第一种语法而不是第二种语法?
没有人应该成为数组的第一个语法。第二种语法专门为数组添加。