2010-06-15 7 views
2

정적 CComPtr 멤버 변수를 응용 프로그램에 포함시키는 것은 좋지 않습니다. 우리는 정적 변수의 제어 파괴를 할 수 없으므로 CoUninitialze 후에 발생할 수 있습니다.정적 CComPtr 변수

+0

이미 질문에 답변하셨습니다. 예, 나빠요. –

답변

2

적절한 예방 조치를 취한 경우 CComPtr을 정적 멤버로 사용하는 것이 본래 나쁘지는 않습니다. 나는 당신이 고려해야한다는 의미 "적절한 예방 조치"으로

:

  • 에 대한 액세스 권한을 Mutexing;
  • 초기화하기 전에 사용하기 전에 ;
  • 사용자 자신의 클래스에 대해 상호 배제 된 정적 인스턴스 카운트 유지.
  • 인스턴스 카운트가 0에 도달하면 클래스가 자신의 FinalRelease 메서드에서 호출되는지 확인합니다. 세르게이는 자신의 의견에, 나는 그것이 나쁜 생각 말했듯이
0

나쁜 생각이다. 정적 객체의 소멸자는 C++ 03 표준의 3.6.3 절에서 설명 된대로 메인 종료 후에 호출됩니다.

정적 저장 기간의 초기화 된 객체에 대한 소멸자 (블록 범위 또는 네임 스페이스 scope)는 main에서 돌아와 exit (18.3)를 호출 한 결과 호출됩니다. 이러한 객체는 생성자 완료 또는 동적 초기화 완료의 역순으로 파괴됩니다. 객체가 정적으로 초기화되면 객체가 동적으로 초기화 된 것과 같은 순서로 객체가 파괴됩니다. 배열 또는 클래스 형의 객체의 경우, 그 객체의 모든 하위 객체는 파괴되고, 그 하위 객체의 구축 중에 정적 저장 기간이 초기화 된 임의의 로컬 객체는 파기됩니다.

여기에서 데모 된대로 : http://www.geeksforgeeks.org/static-objects-destroyed/.

메인이 끝나기 전에 주 스레드에서 COM 라이브러리를 정리하는 CoUninitialize이 호출됩니다. CoUninitialize는 msdn 설명서에서 설명한대로 나머지 모든 리소스를 정리합니다. CoUninitialize가 호출되기 전에 COM 개체의 Release 메서드를 호출해야합니다. 이후에 더 이상 존재하지 않으므로 CoUninitialize가 호출되기 전에 CComPtr 소멸자에 대한 호출이 발생하는지 확인해야합니다. 따라서 CComPtr은 정적으로 만들어서는 안됩니다.