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