因此,我正在尝试实现唯一的指针,并且希望能够在分配单个对象和分配数组之间进行选择。
假设如果我使用new[]
甚至是单个对象(new[1]
)分配了所有内容,而不是根据构造函数的参数在new T(Args...)
和new[n] T(Args...)
之间进行选择,
会像这样删除:
delete[] this->ptr;
有什么缺点vs
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[]>
专门化。并且由于选择是在编译时进行的,因此不需要运行时分支。
关于c++ - 删除动态分配的数组与单个指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61434211/