2012-04-15 2 views
0

이 질문이 너무 기본적인 질문이 아니길 바랍니다. 객체의 동일한 수를 동적으로 할당되는 두 경우 모두C++에서 for 루프의 변수에 새 객체 할당

int *a; 
while (1) { 
    a = new int(1); 
    // Do stuff with a 
} 

에 반대

while (1) { 
    int *a = new int(1); 
    // Do stuff with a 
} 

을하는 사이에 차이가 있는지 궁금하네요. 하지만 int 키워드가 첫 번째 예제의 루프 내에서 사용된다는 사실은 사용 된 메모리에 영향을 줍니까?

+2

여기서 '새'를 사용하는 이유가 있습니까? – Pubby

+0

동적으로 할당 된 객체가 필요한 컨테이너 클래스가 있습니다. 그리고 나는 단지 호기심이 많았습니다. – gsingh2011

답변

4

차이는 범위입니다.

while (1) { 
    int *a = new int(1); 
    // Do stuff with a 

    // Don't forget to delete a. 
} 

// Cannot access `a` here... 

반면 :

int *a; 
while (1) { 
    a = new int(1); 
    // Do stuff with a 

    // Don't forget to delete a. 
} 

// Can access `a` here. 

당신은 당신의 두 예제에서 a memory leak 있습니다. smart pointers을 선호하십시오!

+0

첫 번째 예제에서 반복에 대한 참조가 루프의 각 반복마다 다시 작성되었는지는 확실하지 않았습니다. 그리고 실제로, delete a가 어딘가에 있음을 암시합니다. 감사. – gsingh2011

+0

나는 그것이 묵시적이라고 생각하지 않았다. 당신이 실제로하려고하는 것은 무엇입니까? – Johnsyweb

+0

동적으로 할당 된 객체 만 수락 한 컨테이너 클래스를 사용해야했습니다. 그리고 나는 변수'a'로 무슨 일이 일어나고 있는지 궁금했습니다. 두 번째 예제에서 동일한 참조가 사용되었지만 처음에는 메모리에 새 참조가 만들어 졌는지, 프로그램이 종료 될 때까지 스택에 새 레지스터가 있는지 확실하지 않았습니다. 내가 int로 다시 선언하더라도 동일한 참조가 사용됩니다. – gsingh2011

4

본질적으로 동일하며 거의 동일하게 컴파일됩니다. 그렇지 않은 경우에도 힙 할당을 수행한다는 사실은 추가 스택보다 비용이 많이 듭니다.

더 엄격한 범위 지정을 사용하므로 첫 번째를 선호합니다.