C++ 执行构造函数时未分配全局常量变量

C++ 执行构造函数时未分配全局常量变量,c++,constructor,mfc,visual-c++-6,C++,Constructor,Mfc,Visual C++ 6,MY\u GLOBAL\u CONST在ProblemClass::ProblemClass()中尝试使用时未分配它。为什么?如何解决这个问题?我正在从事一个旧的VC6 MFC项目 SomeClass.h #include "ProblemClass.h" class SomeClass { private: ProblemClass m_problemClass; //created on the heap public: SomeClass(); ~SomeCl

MY\u GLOBAL\u CONST
ProblemClass::ProblemClass()
中尝试使用时未分配它。为什么?如何解决这个问题?我正在从事一个旧的VC6 MFC项目

SomeClass.h

#include "ProblemClass.h"
class SomeClass  
{
private:
    ProblemClass m_problemClass; //created on the heap

public:
    SomeClass();
    ~SomeClass();
}
class ProblemClass
{
public:
    ProblemClass();
    ~ProblemClass();
}
问题类.h

#include "ProblemClass.h"
class SomeClass  
{
private:
    ProblemClass m_problemClass; //created on the heap

public:
    SomeClass();
    ~SomeClass();
}
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说的绝对正确,“这里发生的是两个全局初始化器以错误的顺序执行”。

我看你在声明中遗漏了
static
关键字。我的gloabl变量配方需要在类外初始化

头文件 源文件
我看你好像错过了声明中的
static
关键字。我的gloabl变量配方需要在类外初始化

头文件 源文件 尝试替换:

const CString MY_GLOBAL_CONST = _T("User");
与:

后一种构造不需要任何运行时初始化,因此可以在其他初始化代码中依赖
MY\u GLOBAL\u CONST
(因为这里肯定发生的是两个全局初始化器以错误的顺序执行)。

尝试替换:

const CString MY_GLOBAL_CONST = _T("User");
与:



后一种构造不需要任何运行时初始化,
MY\u GLOBAL\u CONST
因此可以在其他初始化代码中依赖(因为这里肯定发生的是两个全局初始化器以错误的顺序执行).

除了
ProblemClass.cpp
之外,源文件中是否有类型为
ProblemClass
SomeClass
的全局变量?不同转换单元中全局变量的初始化顺序未定义。我不全局使用这些类的实例。只有
MY\u GLOBAL\u CONST
是全局的。到目前为止,
SomeClass
仅使用一次,而
ProblemClass
仅在
SomeClass
中使用,您在何时何地使用
SomeClass
?请尝试创建一个显示给我们的。另外,如果您在调试器中发现崩溃,调用堆栈是什么样子的?应用程序非常庞大
SomeClass
在调用堆栈中很早就出现,而
MY\u GLOBAL\u CONST
尚未分配。我们经常使用这些全局常量(在名称空间中),从来没有遇到过这样的问题。但我们还没有在应用程序启动时使用它们。至少在现代项目上,不是我现在要处理的VC6项目。稍后我将提供最简单的示例。如果在调用堆栈上看不到
main
WinMain
,那么实际上您正在某处创建一个
SomeClass
的实例作为全局变量,或其成员。除了
ProblemClass.cpp
之外,源文件中是否有类型为
ProblemClass
SomeClass
的全局变量?不同转换单元中全局变量的初始化顺序未定义。我不全局使用这些类的实例。只有
MY\u GLOBAL\u CONST
是全局的。到目前为止,
SomeClass
仅使用一次,而
ProblemClass
仅在
SomeClass
中使用,您在何时何地使用
SomeClass
?请尝试创建一个显示给我们的。另外,如果您在调试器中发现崩溃,调用堆栈是什么样子的?应用程序非常庞大
SomeClass
在调用堆栈中很早就出现,而
MY\u GLOBAL\u CONST
尚未分配。我们经常使用这些全局常量(在名称空间中),从来没有遇到过这样的问题。但我们还没有在应用程序启动时使用它们。至少在现代项目上,不是我现在要处理的VC6项目。稍后我将提供最简单的示例。如果在调用堆栈上没有看到
main
WinMain
,那么实际上您正在某处创建一个
SomeClass
实例作为全局变量或其成员。在示例中,
MY_GLOBAL_CONST
不是
ProblemClass
@PeterRuderman OP的成员。我试着让它成为成员,因此我选择了这种方式。没有提到全球不属于该类的要求。这只是一种方法。我非常清楚常量是类的一部分。但在这种情况下,我们使用全局的。实际上,它们被包装在名称空间中。在这个例子中,
MY_GLOBAL\u CONST
不是
ProblemClass
@PeterRuderman OP的成员。我试着让它成为一个成员,所以我这样做了。没有提到全球不属于该类的要求。这只是一种方法。我非常清楚常量是类的一部分。但在这种情况下,我们使用全局的。实际上,它们被包装在名称空间中,我很快就会尝试!你的结论听起来很有道理。请注意,每当从
MY\u GLOBAL\u CONST
创建
CString
对象时,这会改变运行时行为。它不能再调用复制任务,需要重新计算长度。如果
MY_GLOBAL_CONST
包含嵌入的NUL字符,这意味着额外的运行时开销和中断。@i在原始问题的上下文中不可检测,
MY_GLOBAL_CONST
怎么可能包含NUL字符?问题是关于具有静态存储持续时间的对象的初始化顺序。无法初始化的对象的特定类型并不重要。但是,更改类型以解决问题会更改程序行为。如果你觉得这不是一个需要注意的重要细节,那么就不要这样做。我不在乎,但未来的访客可能会。我很快会试试的!你的结论听起来很有道理。请注意,每当从
MY\u GLOBAL\u CONST
创建
CString
对象时,这会改变运行时行为。它不能再调用复制任务,需要重新计算