생성자와 소멸 된 인스턴스를 추적하는 중입니다. 생성자와 소멸자에서 "this"값을 기록하려고합니다. "this"값을 생성자에 기록하는 것이 안전한지 여부는 알 수 없습니다. 안전하지 않다면 실패 할 시나리오를 알지 못할 것입니다.이 값을 생성자에 기록하는 것이 안전합니까?
답변
"로깅"이란 "값을 16 진수로 로그 파일에 쓰는"것을 의미하면 괜찮습니다. 그렇지 않은 경우 명확히하십시오.
개체는 생성자 호출이 완료 될 때까지 완전히 구성되지 않습니다. 따라서 그 전에 (즉, 생성자 내에서) 나머지 프로그램에 this
을 게시하는 것은 안전하지 않습니다. 왜냐하면 누군가 반 구조의 객체를 실제로 사용하려고 시도하기 때문입니다. 이것은 미묘하고 찾기 힘든 버그로 이어질 수 있습니다. 다른 목적으로 사용할 수있는 데이터 구조에 저장하는 외부 (비 멤버) 함수에 파라미터로서 전달
- ,
- , : 다음 중 하나를 의미 할 수있다
- (완전성을 위해 : 함수 호출에서 반환 -이 특정 경우에는 적용되지 않습니다. 왜냐하면 생성자에서 아무 것도 반환 할 수 없기 때문입니다).
this
게시
this
의 주소를 파일에 쓰는 것이 나머지 프로그램 *에 게시하지 않으므로 * 괜찮습니다.
* 다른 스레드/프로세스의 파일에서 주소를 다시로드하고이를 객체 포인터로 다시 캐스팅하는 것과 같이 매우 모호한 작업을 수행하지 않으면 ... 이미 자체적으로 안전하지 않은 상태입니다. -)
왜 안전하지 않다고 생각하십니까? 실제로 그 객체가 유효한 한 모든 객체의 주소를 로깅하는 것과 다르지 않습니다.
길고 짧은 것은 사용하려는 시나리오에서 안전하다는 것입니다.
해당 개체가 완전히 구성되지 않았을 때. 그래서 안전하지 않다고 생각했는데 쓰레기를 버릴 수 있습니까? –
생성자 단계에 도달하면 객체가 생성되고 멤버가 initialise 목록과 일부 initialise() 함수를 초기화하는 방법에 따라 멤버가 생성되지 않을 수 있으므로 멤버가 가비지 값을 가질 수 있지만 클래스 객체는 유효합니다 – EdChum
그래서 sceanrio는 생성자와 소멸자를 로깅하여 추적하고 있으며, 안전하며 생성자에서 호출 스택도 로깅하고 있습니다. 나는 이것이 프로그램에서 비파괴 시퀀스를 추적하는 좋은 방법이라고 생각하며 메모리 누수를 쉽게 발견 할 것이다. –
메모리가 먼저 할당 된 다음 this
이 설정되면 생성자가 호출됩니다. 따라서 생성자가 올바른 위치를 가리킬 때 this
을 사용하면 좋습니다. 구성은 this
으로 변경되지 않습니다. 그러나 생성이 실패하면 (throws) 메모리가 사라지고 this
이 가리키는 값이 가비지가됩니다. 그래서 생성을 성공할 때까지 생성자 밖에서 저장하고 사용하지 마십시오.
- 1. 세션에 값을 저장하는 것이 안전합니까?
- 2. awakeFromNib에서보기의 값을 설정하는 것이 안전합니까?
- 3. 이 시나리오에서 액세스 위반을 잡는 것이 안전합니까?
- 4. 이 스크립트를 공개하는 것이 안전합니까? 신참 질문
- 5. 이 파일 검색 스레드를 중단하는 것이 안전합니까?
- 6. 포인터를 사용하여 블록의 값을 변경하는 것이 안전합니까?
- 7. 세션 변수에 값을 저장하고 값을 쿼리하는 것이 안전합니까?
- 8. CancellationToken.None에 등록하는 것이 안전합니까?
- 9. 스트림을 반환하는 것이 안전합니까?
- 10. 휘발유를 버리는 것이 안전합니까?
- 11. 매 방문마다 기록하는 것이 합리적입니까?
- 12. "User.Identity.Name"이 안전합니까?
- 13. 특정 값을 검색 할 때 ClassCastException을 자동으로 catch하는 것이 안전합니까? -
- 14. 열린 파일을 제거하는 것이 안전합니까()?
- 15. 스레드의 부울 값을 다른 스레드의 부울 값으로 설정하는 것이 안전합니까?
- 16. 동일한 키/값을 가진 여러 스레드에서 Dictionary를 업데이트하는 것이 안전합니까?
- 17. 중요한 파일을 저장하는 것이 안전합니까?
- 18. 자료를 업데이트하는 것이 얼마나 안전합니까?
- 19. .apk 파일을 공유하는 것이 안전합니까?
- 20. SDK API에서 enum params 및 반환 값을 사용하는 것이 안전합니까?
- 21. 페이지에 데이터를 반향시키는 것이 안전합니까?
- 22. ThreadPool.RegisterWaitForSingleObject가있는 이벤트를 사용하는 것이 안전합니까?
- 23. 매크로 호출을 중첩하는 것이 안전합니까?
- 24. 배열에 쿠키를 저장하는 것이 안전합니까?
- 25. Delphi에서 제네릭을 사용하는 것이 안전합니까?
- 26. DOM 데이터 -x 속성 호환성 -이 것이 안전합니까?
- 27. NSThread를 공개하는 것이 언제 안전합니까?
- 28. 힙의 벡터에 객체 값을 추가하는 것이 언제 안전합니까?
- 29. 임의의 값을 세션 "키"로 테이블에 저장하는 것이 안전합니까?
- 30. 응용 프로그램 속성을 변경하는 것이 안전합니까?
예이 값을 로그 파일에 저장하고 해당 인스턴스의 소멸자가 호출 될 때마다 다시이 값을 기록합니다. 나는 소멸자가 호출되지 않는 인스턴스 (this)를 식별하기 위해이를 수행하고있다. 이 값을 생성자에서 저장하는 동안 내가하고있는 또 하나의 작업은 호출 스택을 로그 파일에 저장하는 것입니다. 호출 스택과 이것의 도움으로 어떤 호출 스택 인스턴스가 파괴되지 않았는지 쉽게 알 수 있습니다. –
나는 동료들에게도 같은 질문을했다. 그들은 당시 개체가 완벽하게 구성되지 않은 것처럼 생성자에서이 값을 기록하는 것이 안전하지 않다고 말했다. 의심의 여지를 없애고 실패 할 시나리오를 알려주십시오. –
아니요 아니요 프로그램에서이 값을 다시로드하지 않습니다. 이미 내가 이것을 사용하고있는 시나리오를 설명했다. 난 그냥 파괴되지 않은 인스턴스를 추적 싶어요. –