2010-07-25 7 views
2

"스마트 포인터"로 작동하고 클래스가 파괴 될 때 어떤 종류의 시스템 리소스를 해제하는 클래스가 있다고 가정 해 보겠습니다.함수 내에서 생성자에 대한 값을 반환하는 예외

Resource resource(allocateHandle()); 

및 allocateHandle (: 내 코드에서이 작업을 수행 할 경우, 지금

ResourceHandle allocateHandle(); 

:

class Resource{ 
protected: 
    ResourceHandle h; 
public: 
    Resource(ResourceHandle handle) 
    :h(handle){ 
    } 

    ~Resource(){ 
     if (h) 
      releaseResourceHandle(h);//external function, probably from OS 
    } 
}; 

와 나는 "자원"의 초기화에 사용되는 값을 반환하는 몇 가지 기능이) 은 예외을 던졌습니다. 정확히 무슨 일이 벌어 질까요? 추락은 자원()의 건설 도중 또는 건설 전에 발생합니까?

상식은 allocateHandle이 반환되기 전에 예외가 발생하기 때문에 실행은 Resource() 생성자로 들어 가지 않지만 정확히 그것에 대해 확신하지 못한다고합니다. 이것은 올바른 가정입니까?

답변

4

인수는 모든 함수 호출 (이 경우 생성자)보다 먼저 평가됩니다. 따라서 생성자가 호출되기 전에 예외가 throw됩니다.

1

올바른 가정입니다.

0

예, 가정은 정확합니다.

이 시점에서 매개 변수를 생성하고 스택에 밀어 넣으면됩니다. "자원"의 대상도 형성되지 않습니다!

따라서 예외는 스택 되감기 중에 소멸자를 호출하지 않습니다.

1

컴파일러가 생성자에 들어갔다면 반환하지 않은 함수에서 어떤 값을 전달할 수 있습니까?

3

예 (다른 사람들이 말했듯이) 맞습니다.

그러나 당신이 암시하는 것은 무엇입니까 (나는 생각합니다).
생성자가 입력되어 예외가 발생하면 개체에 어떤 변화가 발생합니다.

소멸자가 여전히 실행 되겠습니까?

소멸자는 생성자가 실제로 완료되면 발생합니다 (예외가 생성자를 이스케이프 처리하고 생성자가 완료되지 않은 경우). 이 경우 생성자가 입력되지 않으므로 개체가 존재하지 않으므로 소멸자가 실행되지 않습니다.

생성자가 실행되는 동안 예외가 throw되면 어떻게됩니까?
이 경우 생성자가 완료되지 않았으므로 소멸자가 실행되지 않으며 모든 멤버 필드는 어떻게됩니까? 생성자가 예외를 통해 남겨지면 완전히 구성된 모든 멤버는 소멸자가 호출됩니다 (완전히 구성된 멤버는 생성자가 성공적으로 호출되어 성공적으로 완료된 멤버입니다).

관련 문제