2009-09-01 2 views
2

C++에서는 스택 할당 객체에 대해 소멸자가 호출되는 것을 어떻게 보장합니까?스택 할당 객체에 대해 소멸자가 호출되는 메커니즘은 무엇입니까?

class MyClass { 
public: 

    ~MyClass() 
    { 
    std::cout<<"Destructor called."<<std::endl; 
    } 

    MyClass() 
    { 
    std::cout<<"Constructor called."<<std::endl; 
    } 

}; 

.................................................................... 

//Limit scope for example 
{ 
    MyClass instance; 
} 

생성자와 소멸자가 모두 호출됩니다 무엇을 다음과 같이 내가 동적 메모리를 할당 소멸자 기능 (또는 포인터)에 발생합니다. 무슨 일 이니?

+0

인스턴스가 개체의 이름입니다. instance()는 단순히 클래스의 no 인수 ctor에 대한 호출입니다.이 경우 괄호는 불필요하지만 instance()라는 메서드를 호출하는 것은 아닙니다. – dicroce

+5

동적 메모리 할당이 표시되지 않습니다. –

답변

7

컴파일러는 개체의 소멸자에 대한 호출을 적절한 위치에 삽입합니다.

1

개체를 생성하기 때문에 생성자가 호출됩니다. 소멸자는 해당 객체를 정리하기 때문에 호출됩니다. C++에서 스택에 선언 된 객체는 포함 된 범위가 없어지면 자동으로 정리됩니다.

3

변수가 생성되는 즉시 생성자가 호출됩니다. 소멸자에 관해서는, 컴파일러는 범위의 끝에서 소멸자를 호출하는 코드를 내 보냅니다. 이것을 느끼기 위해서는 'goto'를 사용하거나,/case 구문을 사용하여 범위를 조기에 종료하고 컴파일러가 불평하는 것을 지켜보십시오.

+1

"변수가 생성되는 즉시 생성자가 호출됩니다." 음, 생성자가 호출 될 때 객체 생성이 발생하므로, 당연한 일입니다. 변수 OTOH에 대한 메모리는 더 일찍 제공 될 수 있습니다. – sbi

+1

내가 아는 한 goto를 사용하여 스코프를 종료 할 수 있으며 컴파일러는 객체가 범위를 벗어 났음을 계속 알 수 있습니다. 당신이 할 수없는 것은 goto/switch를 사용하여 객체 선언 (구성)을 단계적으로 수행하는 것입니다. – UncleBens

+0

@UncleBens :이 "객체 정의"를 만들지 만 그렇지 않으면 당신이 옳습니다. (빨리 읽고 마나 구의 대답에서이 오류를 보지 못했습니다.) – sbi

3

예, 생성자와 소멸자가 모두 호출됩니다. 더 중요한 것은 다음과 같습니다.

{ 
MyClass instance; 
throw "exception"; 
} 

이 예제에서는 소멸자도 호출됩니다. 그래서 나는 항상 내 객체를 스택에 할당하는 것을 선호한다. (적어도 스택 할당 된 보호자로 동적 할당을 감싼다. 이

{ 
    int i; 
} 

는 것, 만들고 자동으로 i을 파괴하는 이유

4

궁금하지 않을까요? C++은 기본 제공 형식과 똑같이 동작하는 형식을 만들 수있게 해줍니다. 그리고 단지와 같은 내장 타입, C++로 (다른보다, 말, Java 또는 C#을), 단지 null 또는 일부 실제 개체에 바인딩 할 수있는 기준을 정의하지 않습니다이

{ 
    MyClass instance; 
} 

. 실제 개체를 만듭니다.

개체 생성은 두 단계로 이루어집니다. 먼저 (범위 입력시) 원시 메모리가 제공됩니다. 그런 다음 (객체 정의가 만났을 때) 생성자가 호출됩니다. 내장 유형의 경우 생성자가 호출되지 않습니다. 내장 변수를 초기화하지 않으면 임의의 값을가집니다. (실제로 그것은 비트 패턴이 1 단계에서 제공된 메모리에서 무엇이든간에). 객체 삭제도 두 단계로 진행됩니다. 첫째, 소멸자가 호출되며 (다시 내장 함수가 아닌 경우) 메모리가 반환됩니다. 런타임 시스템.

는 (. 제공 및 스택 변수에 대한 메모리를 삭제하면 일반적으로 등록/incementing 감소시키는만큼 싼 것을 주)

0

음, 그냥 생성자 후 소멸자를 호출하지 않았다.
프로그램을 종료하려고 할 때이를 호출합니다.

int main() { 
    MyClass obj; 
    cout<<"testing....1"<<endl; 
    cout<<"testing....2"<<endl; 
    return 0; 
} 

ANS :

Constructor called. 
testing....1 
testing....2 
Destructor called. 
+1

프로그램이 곧 종료 될 때 소멸자를 호출하지 않습니다. 소멸자는 스택 객체가 범위를 벗어날 때 호출됩니다. 당신이 메인에서 이것을하기 때문에, 그 두 가지는 우연히 일어난다. –

관련 문제