【发布时间】:2019-04-26 05:45:41
【问题描述】:
当我尝试在ProblemClass::ProblemClass() 中使用它时,没有分配MY_GLOBAL_CONST。为什么?如何解决?我正在处理一个旧的 VC6 MFC 项目。
SomeClass.h
#include "ProblemClass.h"
class SomeClass
{
private:
ProblemClass m_problemClass; //created on the heap
public:
SomeClass();
~SomeClass();
}
ProblemClass.h
class ProblemClass
{
public:
ProblemClass();
~ProblemClass();
}
ProblemClass.cpp
#include "ProblemClass.h"
const CString MY_GLOBAL_CONST = _T("User");//Also tried to put that line in ProblemClass.h without luck
ProblemClass::ProblemClass()
{
CString foo = MY_GLOBAL_CONST; //MFC-Runtime assertion fails, MY_GLOBAL_CONST is not assigned yet
}
ProblemClass::~ProblemClass(){}
更新:
经过进一步调查,我可以确认 SomeClass 也在全局上下文中实例化。因此,Paul Sanders 说 “这里发生的是两个全局初始化程序以错误的顺序执行”是绝对正确的。
【问题讨论】:
-
在
ProblemClass.cpp以外的源文件中是否有ProblemClass或SomeClass类型的全局变量?不同翻译单元中全局变量的初始化顺序未定义。 -
我没有在全球范围内使用这些类的实例。只有
MY_GLOBAL_CONST是全局的。到目前为止,SomeClass只使用了一次,ProblemClass只用在了SomeClass -
您何时何地使用
SomeClass?请尝试创建minimal reproducible example 向我们展示。另外,如果您在调试器中捕获崩溃,调用堆栈是什么样的? -
应用程序很大。
SomeClass出现在调用堆栈的早期,而MY_GLOBAL_CONST尚未分配。我们经常使用这些全局常量(在命名空间内)并且从来没有遇到过这样的问题。但是我们还没有在应用程序的启动中使用它们。至少在现代项目上,而不是我现在必须处理的 VC6 项目。稍后我将提供最小的示例。 -
如果您在调用堆栈上没有看到
main或WinMain,那么您实际上是在某处创建SomeClass的实例作为全局变量或其成员。
标签: c++ constructor mfc visual-c++-6