는 exit()
기능은 세계 모든 개체에 대한 소멸자를 호출하는 프로그램을 받고있다. 그리고 클래스의 소멸자가 exit(1);
을 호출하는 시점에서 객체가 아직 소멸 된 것으로 간주되지 않기 때문에 소멸자가 다시 호출되어 무한 루프가 발생합니다.
class sample {
bool exiting;
public:
sample() { exiting = false; }
~sample() {
cout << "Destructing.." << endl;
if(exiting) return;
exiting = true;
exit(0);
}
};
을하지만 소멸자 호출 exit()
있는 것은 나쁜 생각 :
이 멀리 얻을 수 있습니다. 이러한 대안 중 하나를 고려하십시오
이
- 는
- 는 "프로그램이"완료 될 때까지 실행되는 함수를 작성하고
main()
- 사용
abort()
대신에게에서 호출 종료에 대해 별도의 일반 (비 소멸자) 메소드를 만들 exit()
(감사합니다 goldilocks이 하나를 언급했다). abort()
은 exit()
이 호출되고 main()
이 반환 될 때 정상적으로 수행되는 정리 작업을 모두 무시합니다. 그러나 프로그램에서 특정 정리 작업이 매우 중요 할 수 있으므로 반드시 좋은 생각은 아닙니다. abort()
은 이미 너무나 나쁜 오류 만 제외하면 정리를 우회해야합니다.
나는 이전에 예외를 제안했지만 내부 소멸자로부터 예외를 던진 것에 대해 기억하고 마음을 바꿨다. here's why.
참고 또한, 행동이 일치하지 않습니다 - 일부 컴파일러/환경이 무한 루프가 발생, 일부는하지 않습니다. 소멸자의 어느 지점에서 객체가 파괴 된 것으로 간주되는지를 알 수 있습니다. 나는 표준이 이것을 커버하지 못하거나이 경우의 행동이 정의되지 않았다고 말한다.
어떤 컴파일러를 사용하고 있습니까? – delicateLatticeworkFever
아마도 turboc을 사용하고 있으므로 피해야하며 conio.h 기능을 사용하지 마십시오. – phoxis
M은 Dev-C++을 사용합니다. GCC 컴파일러 –