2014-06-11 1 views
1

프로그래밍 분야에서 수년간의 경험이 있지만 C++을 처음 접했습니다. 나는 완전히 다음 줄이 어떤 작업을 수행하는지 이해가 안 :값으로 멤버 개체 할당 : 내 가설이 맞습니까?

this -> obj = MyObject(param) 

첫째, 나는 다음과 같은 가설은 어떤 일이 발생했습니다 : MyObject를 (PARAM), 객체의 로컬 버전을 호출 할 때 는 는

  • 만들어집니다 스택에.
  • 이 개체는 this -> obj로 복사됩니다.
  • 프로그램이 현재 범위 (즉, 줄이있는 메서드)를 벗어날 때 개체의 로컬 버전의 소멸자가 호출됩니다.

이 정보가 맞습니까?

둘째 : 생성시 obj가 기본 생성자에 의해 생성됩니다. 이 객체의 소멸자는 언제 호출됩니까? 나는 위의 줄을 덮어 쓰기 직전에 발생한다고 가정하지만, 디버그 출력은 이것이 손상 될 때 발생한다는 것을 나타냅니다.

+0

문제의 라인을 확인하십시오. 'obj'의 생성과 파기와 관련해서는 표시되지 않은 코드에 따라 다릅니다. 할당은 대개 할당 된 객체의 소멸자를 호출하지 않습니다 (사용자 지정 할당 연산자는 기술적으로 그렇게 할 수 있지만 매우 취약하기 때문에 매우 나쁜 습관입니다) –

+0

obj의 유형은 무엇입니까? – RedX

+1

세 번째 결론은 정확하지 않습니다. temp 객체 *는 명령문이 끝난 직후에 파괴 될 수 있습니다. 일부 공급 업체는 수명을 연장하여 범위에 맞게 즐기는 것처럼 보입니다. 그리고 거기에 실제로 존재하는 것이 있는지 여부는 MyObject가 move-assignment를 지원하는지 여부에 달려 있습니다. 소멸자는 아무런 실수없이 화재를 일으킬 것입니다. – WhozCraig

답변

3
  1. 마지막 가정은 잘못되었습니다. 일시적 (로컬이라고 부름)은 명령문 종료 직후 파기됩니다. 광고 this -> obj = MyObject(param);에서

  2. , obj는 할당 연산자 (효과적으로 부재를 덮어)함으로써 새로운 객체 할당된다. 그러나 덮어 쓰기파기를 의미하지 않으며 (그리고 ) 할당 연산자 함수 소멸자는 호출되지 않습니다. 은 this (부모)이 파괴되었을 때 파괴됩니다 (비록 포인터가 무엇이든간에 포인터 인 경우 명시 적으로 파괴 할 수 있지만 delete을 호출하면 파괴 될 수 있습니다).

+0

다른 점은 그가 희소식이어서 그가 좋은 직장을 찾았 기 때문에 그가 자리를 잡았다는 점을 지적하는 것이 좋을 것입니다! –