2010-06-03 67 views
3

這是一個有點不清楚,我...所以,如果我有一個函數:C++新和刪除和功能

char *test(int ran){ 
    char *ret = new char[ran]; 
    // process... 
    return ret; 
} 

然後調用它多次:

for(int i = 0; i < 100000000; i++){ 
    char *str = test(rand()%10000000+10000000); 
    // process... 

    // delete[] str; // do i have to delete it here? 
} 

所以問題是,我必須使用delete[]來撥打每個new[]嗎?

+0

這似乎是一個常見的C++問題。一般來說,如果您使用的是同一個類,則需要調用'new'和'delete'。否則我很想看看人們說什麼。 – 2010-06-03 12:38:50

回答

5

你不要到。但是如果你不刪除你用'new'保留的內存,你最終會開始耗盡內存(內存泄漏)。

+0

啊,是的,這是有道理的,因爲我的程序似乎每次都使用越來越多的內存:D – Newbie 2010-06-03 12:44:40

5

是的,你會的,否則你會有內存泄漏。

儘管在一個函數中分配並且在另一個函數中釋放並不是最好的想法。爲什麼不在for循環中分配並將指針傳遞給test - 這將newdelete保留在代碼中。

+3

這樣做完全可以,而且很常見。 – 2010-06-03 12:39:26

+0

廢話。這需要一段時間才能解決:D – Newbie 2010-06-03 12:43:42

+0

@Newbie:我希望你在實際的代碼中實際上不是那麼大的內存分配。它肯定會拋出一個'std :: bad_alloc'異常,否則表示內存分配失敗。 – Naveen 2010-06-03 12:46:00

3

已經給出了答案,但是當您將問題標記爲C++而不是C時,這就是您可能希望在C++中執行該操作的原因(當然,可能還有其他原因不會,但是有很少機會)。

vector<char> (int ran){ 
    vector<char> ret(char); 
    // process... 
    return ret; 
} 

,並呼籲它:

for(int i = 0; i < 100000000; i++){ 
    vector<char> str = test(rand()%10000000+10000000); 
    // process... 
} 

沒有新的,因此沒有因此刪除沒有內存泄漏。

其實,你也可能想用std :: string而不是char *(我用vector來給出一個更一般的例子)。

不要擔心將被複制的數據。編譯器會優化它。 編輯:好吧,它可能不會優化它:)但是它有很大的機會。只要沒有性能問題,請選擇最簡單的版本。

+0

「編譯器會優化它。」 < - 這種方式是瘋狂的...... – zildjohn01 2010-06-03 12:55:48

+0

好吧,這並不比說「它會複製矢量並導致性能損失」更困難。但我仍然編輯它:) – 2010-06-03 12:59:28