2009-02-24 3 views
5

C++ 프로그램에서 메모리를 절약하려고하는데 Perl처럼 블록을 변수의 범위로 사용할 수 있는지 알고 싶습니다.블록을 사용하여 C++에서 변수 범위를 관리 할 수 ​​있습니까?

InputType input; 
ResultType result; 

{ 
    // Block of code 
    MyHugeObject mho; 
    result = mho.superHeavyProcessing(); 
} 

/* 
    My other code ... 
*/ 

내가 블록을 종료 할 때 개체가 소멸 될 것으로 예상 할 수있다 : 수행이 의미 할 수 있습니다,이 전 몇 가지 계산을 수행하고 결과를 제공하는 거대한 객체가 있다고 가정 해 봅시다?

답변

25

예, 가능합니다.

변수 이 범위을 벗어나면 소멸자가 호출되어 힙 할당 메모리를 해제해야합니다.

+0

엄밀히 말하면, 소멸자 호출은 객체 저장에 사용 된 메모리를 해제하는 것과 동일하지 않습니다. – Constantin

+0

질문에 * 거대한 * 단어가 있다고 가정하는 것이 안전하다고 생각합니다. 개체가 힙에 더 많은 메모리 덩어리를 할당하고 해방되기를 원한다는 것을 의미합니다 (예 : 벡터). –

+0

미안하지만, 명시 적 malloc을 수행하지 않는 한 MyHugeObject가 스택에 할당되고 힙에는 할당되지 않는다고 생각됩니다. 내가 틀렸다면 나를 바로 잡아주세요. – 0fnt

18

그렇습니다. 메모리를 보존하는 것 외에도, 소멸자가 호출 될 때 소멸자가 실제로 어떤 일을하기를 원할 때 범위 이탈시 소멸자를 호출하는 것이 자주 사용됩니다 (RAII 참조). 예를 들어, 범위 기반 잠금을 작성하고 예외적으로 안전한 방식으로 쉽게 해제하거나, 공유 또는 귀중한 자원 (파일 핸들/데이터베이스 연결과 같은)에 대한 액세스를 결정 론적으로 제거 할 수 있습니다.

-Rick

+0

범위 기반 잠금에 대한 참조는 매우 좋은 개념입니다. – mghie

3

그냥 당신이 아마 소멸자에서 해제 될 새 /의 malloc을 사용하여 힙에 할당 어떤 메모리가 다시 OS에 공개되지 않습니다 기억 해요. 당신의 프로세스는 그 프로세스를 유지할 것이고, OS는 프로세스가 종료 될 때까지 프로세스를 되돌려주지 않을 것입니다.

+0

이 경우 메모리가 스택에 있지만 OS가 이미 프로그램에 커밋 한 것입니다. (비록 윈도우에서 이것은 놀랍지 않게 항상 그런 경우는 아니지만!) –

+0

True - 제 생각에 어떤 객체의 거대한 객체도 스택 자체에 있더라도 내부적으로 동적으로 메모리를 할당해야합니다. – Jackson

+0

이것은 실제로 정확하지 않습니다. 메모리의 큰 덩어리는 여전히 응용 프로그램에 할당되지만, 사용하지 않으면 실제 메모리에서 페이징되어 성능을 저하시키지 않습니다. 몇 가지 운영 체제 (창)는 사용하지 않는 페이지 된 메모리를 다소 약하게 관리하지만 실제로는 메모리 매핑 된 파일을 사용하고 완료 할 때 매핑을 해제하면이 주소 공간에 별도의 페이지 파일이 만들어지기 때문에 항상이를 피할 수 있습니다. – SingleNegationElimination

2

예. 닫는 중괄호에서 파괴됩니다. 그러나 매우 큰 객체를 스택에 할당하는 것에주의하십시오. 이로 인해 스택 오버플로가 발생할 수 있습니다. 객체를 대량으로 할당하는 경우, 새로운, malloc 등으로 할당 된 힙인지 확인하십시오.

+0

개체는 실제로 힙 할당 메모리를 가리 킵니다. 그러나 가능한 한 빨리 해제하려고합니다. – tunnuz

관련 문제