2013-10-28 125 views

回答

7

您的標題問題的答案很簡單:是的,每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,所有newdelete必要調用容器內完成,你不必關心他們。

你可以寫你的函數是這樣的:

#include <vector> 

void MyFunctoin(int size){ 
    // ... 
    std::vector<int> arr(size); 
    // ... 
} 

,並不會有任何內存泄漏,而無需調用delete任何地方。如果您不想要,則在構建arr時無需指定size

+1

'std :: array'裏面沒有任何'new/delete',它不是動態數組的替代品。 – deepmax

+0

無論std :: array在內部是否使用new或delete都沒有關係。我剛剛說過,*這些功能的所有必要調用都是在容器內執行的。 OP只是想擺脫對'delete'的調用。至於動態數組,這就是爲什麼我包含'std :: vector'。 OP的代碼無論如何都不是有效的C++代碼,因爲'size'需要保持不變。儘管如此,它仍然是有效的。 – Gorpik

+0

@Gotpik:他的代碼在C++中是_valid_,'new'不需要常量大小。在C中沒有'new'關鍵字,所以它在那裏是無效的。將'array'作爲一個容器內部的'new/delete'來解決,只是誤導了新手,因爲'array'不是一個動態容器。 – deepmax

6

是的。使用smart pointers/STL containers(例如,您的情況爲std::vector/boost::shared_array/std::unique_ptr<T[]>)。

+0

這個自動銷燬它的內容,我認爲的std ::陣列也不夠好 –

+2

@Koushik不同的語義。它需要'size'作爲編譯時常量,並在函數的「堆棧」上使用空格。 – juanchopanza

+0

@ juanchopanza哦是的,你的權利,我忘了。 –

1

是的。但你可以使用下面的智能指針來擺脫:

std::unique_ptr<int[]> arr (new int[size]); 
0

是的。您需要將每個newdelete匹配,並且每個new[]delete[]匹配。

有兩種選擇。首先是使用垃圾收集庫,如着名的Boehm GC

第二,更好的解決方案是使用智能指針。這些將在適當的時候爲您撥打delete。 C++標準庫中有一對夫婦,Boost有更多涵蓋幾乎所有可能的用例。

2

如果arr = new後面的部分不包含delete [] arr,那麼會出現泄漏,是的。

解決方法是在合適的位置添加delete [] arr,或使用vector<int> arr(size);unique_ptr<int[]> arr(new int[size])

哪一個是「正確的」選擇取決於你總體上想要達到的目標。

+2

我認爲它應該是''作爲一個數組正確使用。否則,你不能用'[]'運算符來索引它。 – deepmax

+2

@MM .:不僅如此,它還將使用不正確的'delete'形式(沒有'[]'),這是未定義的行爲。最值得注意的是,在大多數平臺上,這意味着只有第一個元素的析構函數會被調用...... –

0

正如已經指出的,所有new都必須在某處匹配delete。智能指針可以方便地爲您處理。

另一個可能適用的非C++解決方案是不使用new,而是使用標準C庫中的alloca。這是更輕量級的,你不必釋放,但當然如果size變得太大,你可以炸掉堆棧。

0

是的。

使用智能指針

template<class C> struct smartpointer 
{ 

    C* data; 
    smartpointer():data(NULL){} 
    ~smartpointer(){if(data){delete data;data=NULL;} 

}; 

當塊到期

+1

你的智能指針不夠智能。爲什麼要從頭開始研究'std :: unique_ptr'和'std :: shared_ptr'? – deepmax

相關問題