new[]
尽管数组到指针的隐式转换无论如何都会启动,但被明确定义为具有指针值。
但我不认为你不走运。毕竟,您的示例不是管理指向 的指针int
,而是管理指向 的指针int[10]
。所以理想的方式是
MyAutoPtr<int[10]> ptr2(new int[10]);
正如 Red-Nosed Unicorn 所提到的,new int[10]
不会创建 C 样式的数组。如果您的编译器也符合 C 标准,它会,但是 C++ 允许 C 样式数组比 C 中的 C 样式数组更多。无论如何,new
如果您这样询问,将为您创建一个 C 样式的数组:
MyAutoPtr<int[10]> ptr2(new int [1] [10]);
不幸的是,delete contents;
即使与int (*contents)[10];
. 允许编译器做正确的事情:标准没有指定将数组转换为与 with 一样的指针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 );
}
出于某种原因,我只是让自己受到;v)
不幸的是,这不适用于动态大小的数组,所以我要写另一个答案。