[C++] C ++ 11에서 부작용이 정의되지 않은 소멸자가있는 객체를 삭제하지 않는 이유는 무엇입니까?


Answers

이 경우 정확한 답변을 제공합니다. 특정 라인은 CWG 1116 , "노조원의 별칭"을 해결하기 위해 도입되었습니다.

Question

이 대답 은 C ++ 11 Standard 3.8을 인용 한 것입니다 :

소멸자에 대한 명시 적 호출이 없거나 삭제 표현식 (5.3.5)이 저장 장치를 해제하는 데 사용되지 않으면 소멸자는 암묵적으로 호출되지 않으며 소멸자가 생성 한 부작용에 의존하는 프로그램은 정의되지 않습니다 행동.

파괴되지 않은 소멸자에 대한 부분은 명확합니다. 이제 건너 뛴 소멸자가 프로그램 동작에 영향을 미쳐야하는 부작용이 있다고 가정합니다.

이제 프로그램 동작이 정의되지 않은 이유는 무엇입니까? 왜 부작용이 건너 뛰지 않습니까 (소멸자가 호출되지 않았기 때문에) 부작용이 적용되지 않고 프로그램이 정상적으로 실행됩니까?




나는 이것이 쓰레기 수거를 허용하는 표준에 놓여 있다고 믿는다. 그리고 C ++이 수집하는 동안 소멸자를 호출하지 않음으로써 다른 언어와 다르게 동작한다는 것을 지적했습니다.

특히 메모리 영역에있는 객체의 소멸자를 호출하지 않고 저장소를 다시 사용할 수 있다고 말합니다. 프로그램이 실행중인 소멸자에 따라 다르면 예상대로 작동하지 않습니다.

소멸자에 의존 하지 않으면 모두 괜찮습니다.