首先,你有內存泄漏。但問題可能不在於此。所以讓我們假設你有一個析構函數來釋放數組。
template<typename Type>
class Array {
size_t n;
Type* buff;
public:
Array(size_t n_): n(n_), buff(new Type[n]) {}
~Array() { delete[] buff; }
};
現在這個特定的代碼是完全安全的。分配n_
時不會拋出異常,初始化順序正確,buff
是您班級中唯一的原始指針。但是,隨着您開始擴展課程和編寫更多課程,內存泄漏的風險會增加。
試想一下,你需要更多的一個成員添加到class Array
:
template<typename Type>
class Array {
size_t n;
Type* buff;
SomethingElse xyz;
public:
Array(size_t n_): n(n_), buff(new Type[n_]), xyz(n_) {}
~Array() { delete[] buff; }
};
如果SomethingElse
的構造函數拋出,分配給buff
內存就會泄漏,因爲析構函數~Array()
將永遠不會被調用。
現代C++調用指針如Type* buff
原始指針因爲你是負責釋放存儲自己的(考慮例外情況考慮在內),並介紹了工具如std::unique_ptr
和std::shared_ptr
,能自動照顧存儲釋放的。
在現代C++中你可以寫你的類是這樣的:
template<typename Type>
class Array {
size_t n;
std::unique_ptr<Type[]> buff;
public:
Array(size_t n_): n(n_), buff(new Type[n_]) {}
};
通知沒有析構函數。 unique_ptr
將負責爲您撥打delete
。
還要注意在初始化列表裏面類成員不存在依賴關係(簡單地寫new Type[n_]
而不是new Type[n]
使你的代碼更健壯)
對於初學者來說,你沒有析構函數,這可能會導致內存泄漏 –
@ArnavBorborah,但這是唯一的*不安全*的東西? – Loay