가 후가 발생되는 블록 스택에서 풀리고된다 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
의 생성자가 호출인가? 그렇다면 exit
은 main()
을 포함하여 모든 주변 스택을 "푸십시오", 맞습니까? 좋아
exit 예외가 throw되는 것처럼 unwind하지 않습니다. 그러나 프로그램을 호출 할 때 프로그램이 죽기 직전이므로 실제로는 필요하지 않습니다. std :: terminate와 같은 다른 "die now"함수에 대해서도 동일합니다. – polkadotcadaver
@polkadotcadaver : 리소스가 OS에 의해 정리되는 동안 버퍼링 된 스트림을 비우는 등 개체를 파괴하는 것이 여전히 바람직 할 수 있습니다. 그러나,'exit()'는 실제로 로컬 클린업을하지 않습니다 (여전히 전역 객체들을 정리합니다). –
@ DietmarKühl 동의합니다. RAII가 새롭거나 삭제 된 것보다 더 상상력이 많이 쓰이는 곳에서는 항상 정상적으로 정리 작업을 처리하는 것이 좋습니다. – polkadotcadaver