2012-07-18 2 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

누수가있는 이유는 무엇이라고 생각하십니까? –

+1

'new'와'delete'를 직접 사용하지 마십시오. 메모리 누수가 없습니다. –

답변

12

이 코드는 예외가 아닙니다. 예외가 발생하면 new[]delete[] 사이에 예외가 발생하면 해당 블록이 누수됩니다. 이 문제를 해결하려면 std::vector을 사용하십시오.

+0

왜이 코드에 예외가 있어야합니까?! o.O – Sagi

+3

@Sagi 삽입 연산자 중 하나 인'cout '이나 던지는 것을 멈추게하는 것이 아무것도 없습니다. 나는 int []에 대한 연산을 던질 수는 없다고 생각하지만, 'iostream'은 확실히 할 수있다. –

+0

좋은 지적! :) "단순하다"고 생각하지 않았다. – Sagi

0

아니요,이 경우 루프 내에서 메모리를 비울 수 없습니다. 그러나이 경우에는 scoped_array을 사용하는 것이 좋습니다.

+0

음 ... 'scoped_array'를 의미합니까? –

+0

Ooops! 예 : s입니다. . . 편집 됨 – learnvst

1

이미 sharptooth에서 지적했듯이 try-catch 블록을 사용하여 예외가 catch되고 k이 릴리스되어야합니다. 일반적으로 valgrind을 사용하여 프로그램이 실행 중에 할당 된 모든 블록을 해제하는지 확인할 수 있습니다.

+0

+1 valgrind! – Sterling

관련 문제