删除动态分配的数组与单指针
Deleting dynamically allocated array vs single pointer
所以我正在尝试实现一个唯一指针,我希望能够在分配单个对象和分配数组之间进行选择。
假设我用 new[]
分配所有内容,甚至是单个对象 (new[1]
),而不是根据构造函数参数在 new T(Args...)
和 new[n] T(Args...)
之间进行选择,
会这样删除:
delete[] this->ptr;
与
相比有任何缺点
if (1 < size) {
delete[] this->ptr; // this was allocated with new[]
return;
}
delete this->ptr; // this was allocated with new
提前感谢您的回答。
通常,唯一指针通过获取客户端提供的裸指针的所有权来工作:unique_ptr::unique_ptr(T*)
。在这种情况下,不允许客户端将指针传递给大小为 1 的数组(在一种实现选择中),或者它们不应该将指针传递给非数组(另一种选择) ).
此外,这两种选择都会引入额外的开销,尽管开销很小。一个选择有一个分支,另一个存储数组的大小,非数组分配不需要。
标准唯一指针的指定方式,客户端可以选择他们想要的限制。要使用非数组删除,请实例化 unique_ptr<T>
,要使用数组删除,请实例化 unique_ptr<T[]>
特化。并且因为选择是在编译时进行的,所以不需要运行时分支。
所以我正在尝试实现一个唯一指针,我希望能够在分配单个对象和分配数组之间进行选择。
假设我用 new[]
分配所有内容,甚至是单个对象 (new[1]
),而不是根据构造函数参数在 new T(Args...)
和 new[n] T(Args...)
之间进行选择,
会这样删除:
delete[] this->ptr;
与
相比有任何缺点if (1 < size) {
delete[] this->ptr; // this was allocated with new[]
return;
}
delete this->ptr; // this was allocated with new
提前感谢您的回答。
通常,唯一指针通过获取客户端提供的裸指针的所有权来工作:unique_ptr::unique_ptr(T*)
。在这种情况下,不允许客户端将指针传递给大小为 1 的数组(在一种实现选择中),或者它们不应该将指针传递给非数组(另一种选择) ).
此外,这两种选择都会引入额外的开销,尽管开销很小。一个选择有一个分支,另一个存储数组的大小,非数组分配不需要。
标准唯一指针的指定方式,客户端可以选择他们想要的限制。要使用非数组删除,请实例化 unique_ptr<T>
,要使用数组删除,请实例化 unique_ptr<T[]>
特化。并且因为选择是在编译时进行的,所以不需要运行时分支。