2013-12-13 3 views
0

가 후가 발생되는 블록 스택에서 풀리고된다 Object 힙 및 할당 해제에 구성 메모리를 할당 할 때예외, 풀림 캡슐화 힙 메모리 스택 exit()는 예외가 발생하는 경우

int main() 
{ 
    try 
    { 
     Object x; // doesn't throw 
     Object y; // throws 
     cout << "wonderful"; 
    } 
    catch (...) 
    { 
     cout << "fail"; 
    } 
} 

스택 풀기가 x (소량이 아닌 y)의 소멸자를 호출하지만 생성자가 실패하고 메모리 누수가 없을 때 Object을 보장하므로 메모리 누수가 없어야합니다. 지금까지는 괜찮 았어?

의 깊이로 가자 : 때문에 좋은 교육의

int main() 
{ 
    Object x; // doesn't throw 
    double *d = new double[256*256*256]; // doesn't throw 
    Object y; // throws 
    cout << "wonderful"; 
    delete[] d; 
} 

을, 나는 그것을 OS를하자 자신에 의해 내 쓰레기를 청소하지 싶습니다. 나도 알아, 모든 현대의 운영 체제 자체가 예기치 않은 (또는 예상,하지만 명시적인 할당 취소) 종료 프로그램의 메모리를 힙니다 삭제합니다. 따라서 대문자 인 경우, d의 할당 해제는 내 OS를 수행하지만, x전에 OS가 실행하기 전에 메모리를 적절하게 할당 해제합니다 (맞습니까? 그것에 대해

무엇 :

#include <cstdlib> 

int main() 
{ 
    Object x; // doesn't throw 
    try { Object y; } // throws 
    catch (...) { cout << "fail"; exit(EXIT_FAILURE); } 
    cout << "working and working..."; 
    cin.get(); 
} 

x의 소멸자 전에 라고

exit 다시 OS를 제어 할 수 있습니다? 깊이

그리고 더 :

void Object::be_stupid() 
{ 
    Object a; // doesn't throw 
    try { Object b; }// throws 
    catch (...) { exit(EXIT_FAILURE); } 
} 

void main() 
{ 
    Object x; // doesn't throw 
    try { x.be_stupid(); } // exits program 
} 

exit 다시 OS를 제어 할 수 있습니다 전에 x의 생성자가 호출인가? 그렇다면 exitmain()을 포함하여 모든 주변 스택을 "푸십시오", 맞습니까? 좋아

+1

exit 예외가 throw되는 것처럼 unwind하지 않습니다. 그러나 프로그램을 호출 할 때 프로그램이 죽기 직전이므로 실제로는 필요하지 않습니다. std :: terminate와 같은 다른 "die now"함수에 대해서도 동일합니다. – polkadotcadaver

+0

@polkadotcadaver : 리소스가 OS에 의해 정리되는 동안 버퍼링 된 스트림을 비우는 등 개체를 파괴하는 것이 여전히 바람직 할 수 있습니다. 그러나,'exit()'는 실제로 로컬 클린업을하지 않습니다 (여전히 전역 객체들을 정리합니다). –

+0

@ DietmarKühl 동의합니다. RAII가 새롭거나 삭제 된 것보다 더 상상력이 많이 쓰이는 곳에서는 항상 정상적으로 정리 작업을 처리하는 것이 좋습니다. – polkadotcadaver

답변

0

, 그것은 감사 polkadotcadaver있어 : exit()를 사용하지 main() 때까지 예외를 전파 할 결코 거기에 간단한 return - 모든 스택 Objects 전에 OS 제어됩니다 자신의 소멸자에서 해제됩니다.