2010-03-03 8 views
1

생성자가 실패하면 완료된 멤버 개체가 삭제된다는 것을 알고 있습니다. 메모리 누수가 없습니다.완성 된 개체를 파괴하기 위해 생성자가 롤오버되지 않은 이유는 무엇입니까?

제 질문은 컴파일러가 어떻게합니까? 컴파일러는 어떤 멤버가 생성되었는지를 어떻게 알 수 있습니까? 그 기록을 남기고 있습니까? 컴파일러는이 경우 모든 것을 정말로 파괴합니까? 어떻게 보장하나요?

+1

http://stackoverflow.com/questions/188693/is-the-destructor-called-if-the-constructor-throws-an-exception을 참조하십시오. –

+0

함수 - 로컬 변수 정리 (초기 반환 및 예외 포함)와는 정말 다른 점이 있습니까? 왜 당신은 알 필요가 있습니까? – UncleBens

답변

4

컴파일러는 컴파일러에 따라 다릅니다.

그러나 예, 생성 된 오브젝트가 파괴 된 것으로 보장됩니다 (생성 된 순서와 반대 순서로). §15.2/2

부분적으로 구성되거나 부분적 생성자가 실행을 완료하는 서브 오브젝트 용, 즉 완전 구성된 하위 객체의 모든 실행 소멸자를 가질 것이다 파괴 소멸자가 아직되지 않은 개체 실행을 시작했다. 자동 배열의 요소에 대한 생성자가 예외를 throw하면 해당 배열의 생성 된 요소 만 파괴됩니다. 객체 또는 배열이 new-expression에 할당 된 경우 일치하는 할당 해제 함수 (3.7.3.2, 5.3.4, 12.5)가 호출되면 객체가 사용하는 저장소를 비울 수 있도록 호출됩니다.

관련 문제