문제

나는 당신이 동적으로 할당 된 수업에서 예외를 던질 때 어떤 일이 일어나는지에 대해 일부 동료들과 토론하고있었습니다. 나는 그것을 알고있다 malloc 전화를 받고 클래스의 생성자가됩니다. 생성자는 결코 반환되지 않으므로 malloc?

다음 예를 고려하십시오.

class B
{
public:
    B()
    {
        cout << "B::B()" << endl;
        throw "B::exception";
    }

    ~B()
    {
        cout << "B::~B()" << endl;          
    }
};

void main()
{
    B *o = 0;
    try
    {
        o = new B;
    }
    catch(const char *)
    {
        cout << "ouch!" << endl;
    }
}

감각적 인 기억에 무슨 일이 일어나는지 o, 누출됩니까? CRT는 생성자를 제외하고 메모리를 처리합니까?

건배!
부자

도움이 되었습니까?

해결책

전화

new B();

두 가지로 해결됩니다.

  • 연산자와 할당 New () (Global One 또는 Class 특정, 잠재적으로 구문이있는 배치. new (xxx) B())
  • 생성자를 호출합니다.

생성자가 던지면 해당 연산자 삭제가 호출됩니다. 해당 삭제가 배치 인 경우 배치 삭제 연산자가 구문 :: 연산자 delete ()없이 호출되는 유일한 경우입니다. delete x; 또는 delete[] x; 배치 삭제 연산자를 호출하지 마십시오.

B의 소멸자는 의지한다 ~ 아니다 호출이 삭제되기 전에 이미 구성된 하위 주제 (멤버 또는 B 및 기본 클래스)가 파괴됩니다. 호출되지 않은 생성자는 B를위한 것입니다.

다른 팁

생성자에서 예외가 발생하면 New에 의해 할당 된 메모리가 해제되지만 클래스 B의 소멸자는 호출되지 않습니다.

이 경우, 귀하의 객체 O는 실제로 구성되지 않으며 New에 의해 할당 된 메모리가 해제됩니다. 따라서 소멸자는 부름을받지 않습니다. 따라서 전화 할 필요가 없습니다.

delete o;

흥미로운 디자인 패턴은 RAII- 리소스 획득은 초기화입니다. 이 패턴에서는 생성자를 사용하여 리소스의 획득을 캡슐화하고 파괴자에서 자원을 해제합니다. 리소스를 획득 할 수없는 경우 예제와 매우 유사한 생성자를 던집니다. 따라서 유효한 객체가있는 경우 리소스가 있습니다.

객체가 구성되면 자원을 성공적으로 얻었습니다. 이것은 대상의 수명을 위해 자원을 소유하고 있음을 의미합니다. 객체가 삭제되면 리소스가 해제됩니다. 객체가 구성되지 않으면 자원을 얻지 못했습니다. Wikipedia를 참조하십시오 :

http://en.wikipedia.org/wiki/resource_acquisition_is_initialization

C ++ 2003 표준 5.3.4/17- 새로운 :

위에서 설명한 객체 초기화의 일부가 예외를 던지고 적절한 거래 기능을 찾을 수있는 경우, 객체가 구성된 메모리를 해방시키기 위해 거래 함수가 호출되며, 그 후에 예외는 컨텍스트에서 계속 전파됩니다. 새로운 표현의. 모호하지 않은 일치하는 거래 기능을 찾을 수없는 경우 예외를 전파해도 물체의 메모리가 해제되지 않습니다. [참고 : 호출 된 할당 함수가 메모리를 할당하지 않는 경우에 적합합니다. 그렇지 않으면 메모리 누출이 발생할 수 있습니다. ]

따라서 누출이있을 수도 있고 아닐 수도 있습니다. - 적절한 거래자를 찾을 수 있는지 여부에 따라 다릅니다 (일반적으로 운영자 신입/삭제가 재정의되지 않는 한). 생성자가 던지는 경우 호출로 배선.

이것은 생성자에서 획득 한 리소스에 발생하는 것과 관련이없는 것입니다. 이것은 답변에서 처음 시도한 것입니다. 많은 FAQ, 기사 및 게시물에서 논의되는 질문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top