2012-04-21 2 views
1

생성자와 소멸 된 인스턴스를 추적하는 중입니다. 생성자와 소멸자에서 "this"값을 기록하려고합니다. "this"값을 생성자에 기록하는 것이 안전한지 여부는 알 수 없습니다. 안전하지 않다면 실패 할 시나리오를 알지 못할 것입니다.이 값을 생성자에 기록하는 것이 안전합니까?

답변

8

"로깅"이란 "값을 16 진수로 로그 파일에 쓰는"것을 의미하면 괜찮습니다. 그렇지 않은 경우 명확히하십시오.

개체는 생성자 호출이 완료 될 때까지 완전히 구성되지 않습니다. 따라서 그 전에 (즉, 생성자 내에서) 나머지 프로그램에 this을 게시하는 것은 안전하지 않습니다. 왜냐하면 누군가 반 구조의 객체를 실제로 사용하려고 시도하기 때문입니다. 이것은 미묘하고 찾기 힘든 버그로 이어질 수 있습니다. 다른 목적으로 사용할 수있는 데이터 구조에 저장하는 외부 (비 멤버) 함수에 파라미터로서 전달

  • ,
  • ,
  • : 다음 중 하나를 의미 할 수있다 this 게시

  • (완전성을 위해 : 함수 호출에서 반환 -이 특정 경우에는 적용되지 않습니다. 왜냐하면 생성자에서 아무 것도 반환 할 수 없기 때문입니다).

this의 주소를 파일에 쓰는 것이 나머지 프로그램 *에 게시하지 않으므로 * 괜찮습니다.

* 다른 스레드/프로세스의 파일에서 주소를 다시로드하고이를 객체 포인터로 다시 캐스팅하는 것과 같이 매우 모호한 작업을 수행하지 않으면 ... 이미 자체적으로 안전하지 않은 상태입니다. -)

+0

예이 값을 로그 파일에 저장하고 해당 인스턴스의 소멸자가 호출 될 때마다 다시이 값을 기록합니다. 나는 소멸자가 호출되지 않는 인스턴스 (this)를 식별하기 위해이를 수행하고있다. 이 값을 생성자에서 저장하는 동안 내가하고있는 또 하나의 작업은 호출 스택을 로그 파일에 저장하는 것입니다. 호출 스택과 이것의 도움으로 어떤 호출 스택 인스턴스가 파괴되지 않았는지 쉽게 알 수 있습니다. –

+0

나는 동료들에게도 같은 질문을했다. 그들은 당시 개체가 완벽하게 구성되지 않은 것처럼 생성자에서이 값을 기록하는 것이 안전하지 않다고 말했다. 의심의 여지를 없애고 실패 할 시나리오를 알려주십시오. –

+0

아니요 아니요 프로그램에서이 값을 다시로드하지 않습니다. 이미 내가 이것을 사용하고있는 시나리오를 설명했다. 난 그냥 파괴되지 않은 인스턴스를 추적 싶어요. –

0

왜 안전하지 않다고 생각하십니까? 실제로 그 객체가 유효한 한 모든 객체의 주소를 로깅하는 것과 다르지 않습니다.

길고 짧은 것은 사용하려는 시나리오에서 안전하다는 것입니다.

+0

해당 개체가 완전히 구성되지 않았을 때. 그래서 안전하지 않다고 생각했는데 쓰레기를 버릴 수 있습니까? –

+0

생성자 단계에 도달하면 객체가 생성되고 멤버가 initialise 목록과 일부 initialise() 함수를 초기화하는 방법에 따라 멤버가 생성되지 않을 수 있으므로 멤버가 가비지 값을 가질 수 있지만 클래스 객체는 유효합니다 – EdChum

+0

그래서 sceanrio는 생성자와 소멸자를 로깅하여 추적하고 있으며, 안전하며 생성자에서 호출 스택도 로깅하고 있습니다. 나는 이것이 프로그램에서 비파괴 시퀀스를 추적하는 좋은 방법이라고 생각하며 메모리 누수를 쉽게 발견 할 것이다. –

0

메모리가 먼저 할당 된 다음 this이 설정되면 생성자가 호출됩니다. 따라서 생성자가 올바른 위치를 가리킬 때 this을 사용하면 좋습니다. 구성은 this으로 변경되지 않습니다. 그러나 생성이 실패하면 (throws) 메모리가 사라지고 this이 가리키는 값이 가비지가됩니다. 그래서 생성을 성공할 때까지 생성자 밖에서 저장하고 사용하지 마십시오.

관련 문제