【发布时间】:2012-03-01 05:20:50
【问题描述】:
我有一个静态 const 类成员的情况,它调用一个静态函数来初始化它的值:
//A.h
class A
{
public:
static const int NUM;
static int Function();
};
//A.cpp
const int A::NUM = A::Function();
问题是 A::Function() 有一个局部静态变量,需要通过调用 CoInitialize() 来初始化 COM 库:
//A.cpp
int A::Function()
{
static vartype m;
if(SUCCEEDED(CoInitialize(NULL)))
//Now m can be used and initialized.
// m.CreateInstance....
}
我之前在 WinMain 中调用了 CoInitialize():
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, PSTR cmdLine, int showCmd)
{
if(SUCCEEDED(CoInitialize(NULL)))
{
MyApp* app = new MyApp;
app->Run();
delete app;
CoUninitialize();
}
return 0;
}
但是由于在调用 A::Function() 时初始化静态成员变量 A::NUM 时调用了 ConInitialize(),并且这将在 WinMain 中的代码执行之前发生,我想我可以将其从我的 WinMain:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, PSTR cmdLine, int showCmd)
{
//if(SUCCEEDED(CoInitialize(NULL)))
{
MyApp* app = new MyApp;
app->Run();
CoUninitialize();
}
return 0;
}
现在程序运行良好,但当我退出时它因访问冲突而崩溃。谁能解释一下为什么会这样?
编辑:我在想,由于静态变量应该在程序期间持续存在,所以当我调用 CoUninitialize() 时,本地静态变量 m(需要 COM 库)会遇到问题。崩溃似乎与这个局部变量m有关。但问题是,我什么时候可以为需要 COM 库的静态变量调用 CoUninitialize()?如果我取消注释 WinMain 中的 if 语句,问题似乎就消失了,但我认为那是因为我最终调用了 CoInitialize() 两次,而 CoUninitialize() 只调用了一次。
【问题讨论】: