이를테면
#include<iostream>
using namespace std;
class fuck{
private:
int a;
public:
fuck(int x) {a=x; cout<<a<<"constructed"<<endl;}
~fuck() {cout<<a<<"destructed"<<endl;}
};
int main(void){
fuck a(10);
a.~fuck();
fuck b(20);
return 0;
}
이 코드를 컴파일하면
10constructed
10destructed
20constructed
20destructed
10destructed
이런 결과가 출력됨
분명히 10이 들어간 객체를 먼저 소멸자 불렀는데도 프로그램 종료시 소멸이 또됨(맨 밑10destructed)
어떻게 해야 프로그램 종료 전에 완전삭제 가능?
자동변수(지역변수)로 선언했으니까 그렇지. 동적 할당하면야 delete 하면 되지만.
중괄호로 싸. 살려두고 싶은 범위 만큼. {fuck a(10); ...... } fuck b(20);
중괄호는 무슨 말씀인지 이해가 안가고....
fuck *a = new fuck(10); fuck *b = new fuck(20); a-> ~fuck(); b-> ~fuck();
이렇게 객체 동적할당하니 되네염 대신 힙이라 자동삭제는 안되고요
소멸자를 직접 호출해 주는 건 소멸된 것처럼 클래스를 속였을 뿐 실제 소멸된 건 아님.
객체가 소멸되는 조건은 객체의 생존 주기(lifetime)를 벗어났을 때임. 가령 함수 내에 선언된 객체면 함수가 끝날 때 소멸되는 거지. 저기서 실제 a가 없어지는 건 main 함수가 끝날 때야. (프로그램이 끝날 때가 아니라 -- 뭐 main 함수 밖에 없으니 그 말도 맞겠지만 정확히 표현하자면 main 함수가 끝날 때.)
int main(){ { fuck a(10); cout << "hoy"; } fuck b(20); return 0; } 해 보면 알지
C/C++에서는 함수 안이라고 하더라도 중괄호를 또 써서 블록을 만들 수 있다. compound statement라고 부르는 건데. main() { a; { b; c; } d; ... } 이런 식으로 안에 또 중괄호를 쓰는 거지.
중괄호 안에 선언된 객체는 중괄호가 끝날 때까지의 lifetime(수명)을 갖는다.
그래서 { fuck a(10); ... } 하면 }를 만났을 때 a가 소멸되는 거지.
동적 할당으로 하려면 fuck *a = new fuck(10); 처럼 할당했으면 소멸하고 싶을 때 소멸자를 부르는 게 아니라 delete a; 로 메모리를 해제해 주면 알아서 객체 소멸이 돼. 소멸자를 직접 호출해 주는 건 소멸자라는 함수를 불렀을 뿐 실제 소멸이 되는 건 아냐.
자동변수 선언을 둘러싼 닫힌 중괄호를 만났을때 해제된다.
아, 다들 감사합니다. delete로 고쳐야겠네염