如果我有這樣一個功能:我是否需要爲C++中的每個新建使用delete?
void MyFunctoin(int size){
// ...
int *arr=new int[size];
// ...
}
- 是否有內存泄漏?
- 如果是,有沒有辦法解決它,而不使用
delete
?
如果我有這樣一個功能:我是否需要爲C++中的每個新建使用delete?
void MyFunctoin(int size){
// ...
int *arr=new int[size];
// ...
}
delete
?您的標題問題的答案很簡單:是的,每new
必須匹配delete
。在你的情況下,因爲你使用new[]
,所以在某處必須有一個delete[]
。
但是你不需要自己寫。使用管理自己資源的類通常要好得多。在你的情況下,你最好使用STL容器,如array<>
或vector<>
。這一點,無論是:
std::array<int, size> arr; // fixed size (known at compile time)
或
std::vector<int> arr; // variable size
在vector
,所有new
和delete
必要調用容器內完成,你不必關心他們。
你可以寫你的函數是這樣的:
#include <vector>
void MyFunctoin(int size){
// ...
std::vector<int> arr(size);
// ...
}
,並不會有任何內存泄漏,而無需調用delete
任何地方。如果您不想要,則在構建arr
時無需指定size
。
是的。使用smart pointers
/STL containers
(例如,您的情況爲std::vector
/boost::shared_array
/std::unique_ptr<T[]>
)。
這個自動銷燬它的內容,我認爲的std ::陣列也不夠好 –
@Koushik不同的語義。它需要'size'作爲編譯時常量,並在函數的「堆棧」上使用空格。 – juanchopanza
@ juanchopanza哦是的,你的權利,我忘了。 –
是的。但你可以使用下面的智能指針來擺脫:
std::unique_ptr<int[]> arr (new int[size]);
是的。您需要將每個new
與delete
匹配,並且每個new[]
與delete[]
匹配。
有兩種選擇。首先是使用垃圾收集庫,如着名的Boehm GC。
第二,更好的解決方案是使用智能指針。這些將在適當的時候爲您撥打delete
。 C++標準庫中有一對夫婦,Boost有更多涵蓋幾乎所有可能的用例。
如果arr = new
後面的部分不包含delete [] arr
,那麼會出現泄漏,是的。
解決方法是在合適的位置添加delete [] arr
,或使用vector<int> arr(size);
或unique_ptr<int[]> arr(new int[size])
。
哪一個是「正確的」選擇取決於你總體上想要達到的目標。
我認爲它應該是'
@MM .:不僅如此,它還將使用不正確的'delete'形式(沒有'[]'),這是未定義的行爲。最值得注意的是,在大多數平臺上,這意味着只有第一個元素的析構函數會被調用...... –
正如已經指出的,所有new
都必須在某處匹配delete
。智能指針可以方便地爲您處理。
另一個可能適用的非C++解決方案是不使用new
,而是使用標準C庫中的alloca
。這是更輕量級的,你不必釋放,但當然如果size
變得太大,你可以炸掉堆棧。
是的。
使用智能指針
template<class C> struct smartpointer
{
C* data;
smartpointer():data(NULL){}
~smartpointer(){if(data){delete data;data=NULL;}
};
當塊到期
你的智能指針不夠智能。爲什麼要從頭開始研究'std :: unique_ptr'和'std :: shared_ptr'? – deepmax
'std :: array'裏面沒有任何'new/delete',它不是動態數組的替代品。 – deepmax
無論std :: array在內部是否使用new或delete都沒有關係。我剛剛說過,*這些功能的所有必要調用都是在容器內執行的。 OP只是想擺脫對'delete'的調用。至於動態數組,這就是爲什麼我包含'std :: vector'。 OP的代碼無論如何都不是有效的C++代碼,因爲'size'需要保持不變。儘管如此,它仍然是有效的。 – Gorpik
@Gotpik:他的代碼在C++中是_valid_,'new'不需要常量大小。在C中沒有'new'關鍵字,所以它在那裏是無效的。將'array'作爲一個容器內部的'new/delete'來解決,只是誤導了新手,因爲'array'不是一個動態容器。 – deepmax