프로그래밍 과제를 수행하는 동안 기본 C++ 개념보다 문제가있는 것으로 보입니다. 내 프로그램에서 버그를 발견하고 그것이 내 소멸자가 예상했던 것보다 더 많은 시간 동안 실행 되었기 때문입니다. 다음은 내가 잘못하고있는 것을 보여주는 코드 샘플입니다. 맨 아래 필수 사항입니다. 나는 일이 기대C++ : 소멸자가 두 번 실행되는 이유는 무엇입니까?
#include <iostream>
using namespace std;
class A
{
public:
A(int num)
{
number = num;
cout << "A constructed with number " << number << ".\n";
}
~A()
{
cout << "A destructed with number " << number << ".\n";
}
private:
int number;
};
class B
{
public:
B(A pa)
: a(pa)
{
cout << "B constructor run.\n";
}
~B()
{
cout << "B destructor run.\n";
}
private:
A a;
};
int main()
{
A foo(7);
{
B bar(foo);
}
//Pause the program.
system("pause");
}
는 A foo(7);
가 7
를 전달 생성자를 foo
를라는 A
객체의 스택에 공간을 할당하고 전화입니다. 7
을 number
에 할당하고 생성자가 실행되었음을 나타내는 출력을 인쇄합니다. 이제 B bar(foo);
은 bar
이라는 B
개체에 대해 스택에 공간을 할당하고 foo
을 값으로 전달하는 생성자를 호출합니다.이 값은 int
의 컨테이너 일뿐입니다. 생성자는 전달 된 A
매개 변수를 자신의 개인 데이터 멤버 a
에 할당하고 출력을 화면에 출력합니다. bar
이 닫는 중괄호의 범위를 벗어나면
A a
에 대한 소멸자를 호출 화면에 출력을 인쇄하는
bar
의 소멸자를 호출 할 것으로 예상된다. 소멸자는 출력을 화면에 출력하고 포함하고있는
int number
을 버립니다. 나는 출력해야 기대
:
A constructed with number 7.
B constructor run.
B destructor run.
A destructed with number 7.
//Destructors should be called in the reverse order of their construction right?
실제 출력 :
A constructed with number 7.
B constructor run.
A destructed with number 7. //This is unexpected.
B destructor run.
A destructed with number 7.
추가 파괴하는 것이 원인이 무엇입니까?
시끄러운 복사 생성자도 만드십시오. –
[규칙 3] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) – rlduffy
가능한 복제본을 확인하십시오 [클래스의 소멸자가 두 번 호출 된 이유는 무엇입니까?] (http : // stackoverflow.com/questions/2627540/why-is-the-destructor-of-the-class-called-twice) –