new[]
被专门定义为具有指针值,尽管无论如何都会启动数组到指针的隐式转换。
但我不认为你运气不好。毕竟,你的例子不是管理指向int
的指针,而是管理指向int[10]
的指针。因此,理想的方式是
MyAutoPtr<int[10]> ptr2(new int[10]);
由于红鼻子独角兽提到,new int[10]
不创建一个C风格的数组。如果你的编译器也符合C标准,但是C++允许C风格的数组超过C风格的数组的C。无论如何,如果你问这样new
将创建你的C风格数组:
MyAutoPtr<int[10]> ptr2(new int [1] [10]);
不幸的是,delete contents;
甚至不会与int (*contents)[10];
工作。编译器被允许做正确的事情:标准没有指定数组被转换为指针,与new
一样,我相信我记得用GCC代替delete[]
并发出警告。但这是未定义的行为。
因此,您将需要两个析构函数,一个调用delete
,另一个调用delete[]
。因为你不能在部分专业的功能,该功能需要一个专门的部分助手
template< class T > struct smartptr_dtor {
void operator()(T *ptr) { delete ptr; }
};
template< class T, size_t N > struct smartptr_dtor<T[N]> {
void operator()(T (*ptr) [N]) { delete [] ptr; }
};
template< class T >
void proper_delete(T *p) {
smartptr_dtor<T>()(p);
}
出于某种原因,我只是受到自己
; 5)
不幸的是,这并不dynamic-工作因此我将写出另一个答案。
无论如何,这是一个很好的问题:这真的让你希望在语言本身中有一个适当的'array'处理:( – 2010-04-07 08:33:27
)你不应该使用布尔参数来区分类型,因为这个决定是在编译时做出的,所以你应该在类型中表示它,这意味着你为普通指针和数组创建一个智能指针类。 – 2010-04-07 08:43:49