2012-07-18 36 views
0
#include <iostream> 

using namespace std; 

int main() 
{ 
    int i,j; 
    int * k; 
    char m; 
    do{ 
     cin >> j; 
     k = new int[j]; 
     for (i = 0; i < j; i++){ 
      k[i] = i; 
      cout << k[i] << ", "; 
     } 

     delete[] k; 

     cout << "\nContinue?\n"; 
     cin >> m; 
    }while (m != 'n'); 
} 

這是一個程序,我用它來描述我在理解newdelete時遇到的問題。 'K'會產生內存泄漏嗎?這段代碼有沒有內存泄漏?

+5

你爲什麼認爲可能會泄漏? – 2012-07-18 13:55:12

+1

請勿直接使用'new'和'delete',否則內存泄漏。 – 2012-07-18 13:55:33

回答

12

此代碼不是例外 - 如果在new[]delete[]之間引發異常,則指向的塊將被泄漏。使用std::vector來解決此問題。

+0

爲什麼在這段代碼中會出現異常? o.O – Sagi 2012-07-18 13:56:34

+3

@Sagi沒有任何東西阻止'cout'或其中一個插入操作符被拋出。我不認爲'int []'上的操作可以拋出,但'iostream'肯定可以。 – 2012-07-18 14:00:32

+0

好點! :)沒有想到「簡單」 – Sagi 2012-07-18 14:02:09

0

不,在這種情況下它不會在循環中釋放內存。但是,在這種情況下,使用scoped_array會更好。

+0

嗯......你的意思是'scoped_array'吧? – 2012-07-18 13:58:29

+0

哎呀!是:s。 。 。爲valgrind編輯 – learnvst 2012-07-18 15:08:09

1

正如sharptooth所指出的那樣,您應該使用try-catch塊來確保發現任何異常,並且發佈k。 在一般情況下,您可以使用valgrind來檢查程序是否釋放了執行期間分配的所有塊。

+0

+1! – Sterling 2012-07-18 14:33:50