删除动态分配的数组与单指针

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[]> 特化。并且因为选择是在编译时进行的,所以不需要运行时分支。