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
对象时,这会改变运行时行为。它不能再调用复制任务,需要重新计算