2016-10-08 2 views
-1

CPP에서 Destructor 메서드를 이해하려고합니다. 사실을 알고 있습니다 : a. 인스턴스가 끝날 때 Destructor 메서드가 자동으로 호출됩니다. b. 명시 적 소멸자 메서드가 정의되어 있지 않으면 컴파일러는 기본 소멸자를 만듭니다 (사용자의 동적 메모리 정리와 같은 특정 작업은 수행되지 않습니다).CPP에서 호출 소멸자 메서드를 이해하는 방법?

그래서 A가 클래스 이름이라고 가정합니다. 여러 번 클래스 A의 소멸자가 호출 될 것입니다 :

"delete [] p"의 마지막 줄은 소멸자로 간주 될 수 없으며, 단지 동적 포인터 p를 삭제하는 데 사용됩니다. 명시 적으로 소멸자가 생성되었는지 여부에 관계없이 A 클래스에 정보가 없으므로 기본 클래스 소멸자가 작성되어 p (두 개의 요소가 A [2]이므로)에 대해 두 번 호출되고 p2에 대해 한 번 총 3 번 호출됩니다 .

위의 정보가 정확한지 여부는 확실하지 않습니다. 희망 CPP 전문가는 나를 도울 수있었습니다. 감사!!

int main(){ 
    A *p = new A[2]; 
    A * p2 = new A; 
    A a; 
    delete []p; 
} 
+1

직접 사용해 보지 않겠습니까? 소멸자가있는 클래스를 작성하고 stdout에 무엇인가를 출력하십시오. http://cpp.sh/7cqsw – tkausl

+0

"그리고 한 번 p2"- 음. 아니. 'p2 삭제 '가 없으며'p2'에 대해'A :: ~ A()'가 호출되지 않습니다. 세 번은'a'의 파괴를위한 것이고'p' 시퀀스의 파괴입니다. – WhozCraig

+0

@tkausl 고맙습니다. –

답변

0

소멸자는 클래스의 모든 인스턴스에 대해 정확히 한 번 호출됩니다. 나는 프로그램 종료의 한계를 배제하여 잔류 객체의 소멸자 (아무런 요점도 없음)를 호출하지 않고 전체 프로세스가 사라지도록한다.

예에서 p은 클래스의 두 인스턴스를 포함하는 배열에 대한 포인터입니다. delete[] p은 클래스의 두 인스턴스를 파괴합니다. 클래스의 소멸자는 파괴되는 각 객체에 대해 한 번 호출되며 총 2 번 호출됩니다. p2은 클래스의 한 인스턴스에 대한 포인터이지만 명시 적으로 delete d가 아니므로 한계 케이스에 해당합니다. 마지막으로 함수 자동 범위에 클래스의 인스턴스가 있습니다. 이 인스턴스는 실행이 함수 범위를 벗어날 때 파괴되므로 다른 소멸자 호출이됩니다.

클래스에 기본 소멸자 또는 명시 적으로 선언 된 소멸자가 있는지 여부에 관계없이 영향을주지 않습니다. 클래스에있는 소멸자가 무엇이든 소멸자가 호출됩니다.

소멸자가 여기에서 여러 번 호출 되더라도 소멸되는 클래스의 각 인스턴스에 대해 정확히 한 번 호출되며, 인스턴스가 여러 개 있음을 명심하십시오.

+0

@samvarshavchik 감사합니다! 정말 많이 도와 줘요! –