왜 소멸자가 생성자보다 더 자주 호출되는 것처럼 보입니까?
#include<iostream>
using namespace std;
class A{
public:
static int cnt;
A()
{
++cnt;
cout<<"constructor:"<<cnt<<endl;
}
~A()
{
--cnt;
cout<<"destructor:"<<cnt<<endl;
}
};
int A::cnt = 0;
A f(A x){
return x;
}
int main(){
A a0;
A a1 = f(a0);
return 0;
}
프로그램 출력됩니다 :
constructor:1 destructor:0 destructor:-1 destructor:-2
생성자와 소멸자가 쌍으로 표시되지 않는 이유는 무엇입니까?
스택 오버플로에 오신 것을 환영합니다! +1 및 전체 샘플 프로그램을 제공해 주셔서 감사합니다. 왜 그것이 중요한지 http://SSCCE.ORG를 참조하십시오. –
'return x;'에 의해 호출 된 복사 생성자는 분명히 이미 최적화되어 있지만 충분히 공격적인 옵티마이 저는'f' ('x'가 값으로 전달됨) 호출시 호출을 제거 할 수 있을지 궁금합니다. 그래서 효과적으로 한 번 기본 소멸자를 호출 한 다음 복사 생성자를 호출합니다. –
@FrerichRaabe : 최적화는 특정 상황에서만 복사 생성자 추출을 허용하는 표준을 따르지 않습니다. 허용 된 모든 상황에서, 생략 된 사본의 출처 또는 목적지가 일시적입니다. –