2011-01-18 3 views
1

코스를 배정하고 C++을 배우는 동안 스택 할당과 동적 할당을 사용해야 할 때를 읽었습니다. 나는 많은 경우 스택 할당을 사용하는 것이 더 쉽고 더 낫다는 것을 알고있다. 그러나 내가 당혹 스럽다는 간단한 상황이 있습니다.C++ 루프 스택 할당

는 for 루프가 있다고 가정하자 :

for(int i = 0; i < 10; i++) 
{ 
    MyObject obj(file); 
    obj.doSomething(); 
} 

이제 문제는 개체의 상태가 포함 된 경우 1에서 10 참깨 반복을 반복하면서, 그것에게 상태를 유지 (동일한 개체를 유지)이다. 어쩌면 Java/C# 배경에서 오는 것이 잘못된 경로로 나를 잡을 것입니다. 그러나이 문제를 해결하는 두 가지 방법 만 볼 수 있습니다.

  1. 동적 메모리 사용.
  2. 생성자에 파일을 제공하지 않고 대신 doSomething(file) 메서드에 파일을 제공하지 않지만 파일 객체를 조작하는 메서드가 두 개 이상인 경우에는 좋지 않습니다. doSomethingElse(file).

그런 상황에서 너희들은 무엇을합니까? 아니면 전혀 그런 상황에 처지는 못합니까?

업데이트 : 내가 잘못 나온 것으로 예상대로 작동합니다. 아래의 수하물을 확인하십시오! 모두 감사합니다

+0

MyObject obj (file);를 동적 메모리로 바꾼 경우에도 범위 때문에 상태가 유지되지 않습니다. –

답변

5

게시 한 코드에서 obj는 반복 사이의 상태를 유지하지 않습니다.

for(int i = 0; i < 10; i++) 
{  
    MyObject obj(file); //obj enters scope, constructor is called with 'file' 
    obj.doSomething(); 
} //obj loses scope, destructor is called 

이 예에서 obj는 매번 다른 개체입니다. 그것은 이전 객체와 동일한 '스택'메모리 위치를 사용하고있을 수 있지만 클래스 소멸자와 생성자는 반복 사이에 호출됩니다.

개체를 한 번만 만들고 반복적으로 사용하려면 루프 앞에 구성하십시오.

function(file) 
{ 
    MyObject obj(file); //obj enters scope, constructor is called with 'file' 

    for(int i = 0; i < 10; i++) 
    {  
     obj.doSomething(); //Same object used every iteration 
    } 

} //obj loses scope, destructor is called 
+0

이것은 내가 기대하는 동작이지만 생성자를 호출 할 때 디버깅 할 때? VC++ –

+0

을 사용하면 디버깅 모드에서 최적화가 비활성화되어 있는지 확인합니다. 컴파일러가 호출을 최적화 할 수 있습니다. – James

+0

감사합니다. D –

1

이 코드에서는 선언을 포함하는 줄에 도달하고 각 루프 반복 끝에 해당 소멸자 (소멸자가 호출 됨)가 루프 될 때마다 obj이 생성됩니다 (해당 생성자가 호출 됨). 당신이 한 번 만들려하고, 루프 반복을 통해 그 상태를 저장 루프의 외부에 선언하는 경우

:

MyObject obj(file); 
for (int i = 0; i < 10; i++) 
{ 
    obj.doSomething(); 
} 

이 같은 여러 반복에 걸쳐 사용되는 것과 동일한 개체를해야하는 경우 반복하는 동안 (예 : 파일을 변경하여) 객체의 상태를 변경해야하는 경우 해당 상태를 변경할 수있는 멤버 함수가 필요합니다 (useThisFile(file)과 같은 전용 멤버 함수 또는 멤버에 대한 추가 매개 변수) 기능은 doSomething(file)처럼 사용됨).

0

다음은 주변 스택에 개체를 할당하고 이후에 수행 한 작업을 수행하지 않습니까?

MyObject obj(file); 
for (int i = 0; i < 10; i++) 
{ 
    obj.doSomething(); 
} 
0

위 코드에서 obj는 루프의 단일 반복 범위 내에서 만들어지고 끝에서 종료됩니다. 이것은 자바에서 MyObject obj = new MyObject()를 같은 위치에 두는 것과 같습니다.파일의 상태를 변경하지 않는 한 정보가 루프의 한 반복에서 다른 반복으로 전환되지 않습니다.

자신을 설득하려면 함수 호출을 루프의 "본문"으로 배치하십시오. 이 함수에서 스택에 변수를 만듭니다. 변수는이 함수가 실행되는 동안 만 살 수 있습니다.

0

obj은 모든 반복 끝마다 할당 해제됩니다. 소멸자도 10 번 호출됩니다. 클래스의 소멸자가 제대로 생성자에 의해 생성 된 것이 있다면 delete입니다. 괜찮을 것입니다.

효율성 노트에서 루프에 들어가기 전에 obj을 한 번 선언하고 싶을 수 있습니다.