2016-12-22 1 views
0
#include <iostream.h> 
class a { 
public: 
    ~a() { cout << 1; } 
}; 
int main() 
{ 
    a ob; 
    ob.~a(); 
    return 0; 
} 


무엇이 잘못 되었나요?
나는 여전히 내가 다른 파괴를 사용하여이 C++ 코드에 어떤 문제가 있습니까?


출력을 추측 " ob.~a();"라인에서 예상

멤버 식별자의 오류를 받고 있어요, 터보 C++에서 실행되는 코드를 시도했습니다?

+0

스택 오버플로에 오신 것을 환영합니다. [The Tour] (http://stackoverflow.com/tour)를 읽으신 후 [Help Center] (http://stackoverflow.com/help/asking)의 자료를 참조하십시오. 여기에 물어보십시오. –

+10

일반적으로 소멸자를 호출하면 안됩니다. 그리고 TurboC++는 너무 오래되었고 표준을 준수하지 않아 실제로 왜 그런 일을하는지 묻지 않습니다. –

+1

OP –

답변

4

일반적으로 명시 적으로 소멸자 함수를 호출하지 마십시오. 인스턴스가 범위를 벗어나면 암시 적으로 호출됩니다.

동일한 인스턴스에 대해 소멸자 함수를 두 번 호출하면 정의되지 않은 동작이 발생합니다.


현대 컴파일러에는 컴파일러 오류가 발생하지 않습니다. here을 참조하십시오. 오류 메시지를 남기는 Turbo C++ 설계자의 희소 한 좋은 결정 중 하나 일 수 있습니다.


소멸자 함수를 명시 적으로 호출하는 경우는 거의 없습니다. placement new으로 만든 인스턴스 풀을 유지 관리하는 경우

+1

Re : "Turbo C++ 디자이너의 드문 좋은 결정"- 응? Turbo C++는 기술적 인 사용자가 널리 인정하고 경쟁사보다 표준 적합성과 유용성면에서 훨씬 뛰어 났으며 그 대부분은 길가에 떨어졌습니다. –

2

ob.a::~a()과 통화 할 수 있습니다.

소문자는 명시 적으로 호출 할 필요가 없으며 소멸자를 명시해서는 안되며, ob 개체가 범위를 벗어나면 자동으로 호출됩니다.

관련 문제