Visual c++ 静态CComPtr变量

Visual c++ 静态CComPtr变量,visual-c++,com,static,object-destruction,Visual C++,Com,Static,Object Destruction,在应用程序中使用静态CComPtr成员变量是否不好。 由于我们无法控制静态变量的破坏,并且它可能在初始化后发生。如果您采取适当的预防措施,那么使用CComPtr作为静态成员并不是天生的邪恶 我所说的“适当预防措施”,是指你应该考虑: 屏蔽对它的访问 确保其已初始化 使用前 为您自己的类维护一个静音的静态实例计数 确保在实例计数达到零时在类自己的方法中调用该函数 无论如何,这是个坏主意正如谢尔盖在评论中所说,我认为这是个坏主意。静态对象的析构函数在主终止后调用,如C++03标准第§3.6.3节所

在应用程序中使用静态CComPtr成员变量是否不好。
由于我们无法控制静态变量的破坏,并且它可能在初始化后发生。

如果您采取适当的预防措施,那么使用
CComPtr
作为静态成员并不是天生的邪恶

我所说的“适当预防措施”,是指你应该考虑:

  • 屏蔽对它的访问
  • 确保其已初始化 使用前
  • 为您自己的类维护一个静音的静态实例计数
  • 确保在实例计数达到零时在类自己的方法中调用该函数

    • 无论如何,这是个坏主意

      正如谢尔盖在评论中所说,我认为这是个坏主意。静态对象的析构函数在主终止后调用,如C++03标准第§3.6.3节所述:

      静态存储持续时间(在块范围或命名空间范围声明)的初始化对象的析构函数(12.4)是从main返回的结果,也是调用exit(18.3)的结果。这些对象的销毁顺序与其构造函数或动态初始化的完成顺序相反。如果对象是静态初始化的,则该对象将按照与动态初始化对象相同的顺序销毁。对于数组或类类型的对象,在销毁在构建子对象期间初始化的具有静态存储持续时间的任何本地对象之前,将销毁该对象的所有子对象

      正如这里演示的那样:


      但在主线程终止之前,将调用清理主线程上COM库的。ConInitialize将按照msdn文档中的说明清理所有剩余资源。我们应该在调用CouncInitialize之前调用COM对象的Release方法,因为它们在调用之后将不再存在,因此我们应该确保在调用CouncInitialize之前调用CComPtr析构函数。因此,CComPtr不应该是静态的。

      您已经回答了您的问题。是的,很糟糕。