【发布时间】:2012-12-08 00:29:45
【问题描述】:
我有一个像这样的 C++ 头文件:
class someClass : public someBaseClass
{
public:
someClass();
~someClass();
private:
Text playText; //declare text object
};
它的 C++ 源文件是:
someClass::someClass() : playText("Play") //instantiate text object
{
}
someClass::~someClass()
{
}
然后我有另一个类,它有一个静态成员 someClass:
class anotherClass
{
public:
anotherClass();
~anotherClass();
private:
static someClass className; //declare someClass object
};
对应的C++源文件:
anotherClass::anotherClass()
{
}
anotherClass::~anotherClass()
{
}
someClass anotherClass::className; //must do because its static
我的问题是,当我关闭我的应用程序时,我收到一条错误消息:
Unhandled exception at 0x6903a9e0 in Breakout.exe: 0xC0000005: Access violation reading location 0x00000054.
但奇怪的是,当我在 someClass 构造函数中注释掉我的代码的 : playText("Play") 部分时,消息消失了。我基本上无法实例化playText,否则我会收到错误(仅当我在运行时从不关闭应用程序时)。
我完全糊涂了,找不到任何关于为什么会发生这种情况的信息,所以有人知道为什么会发生这种情况以及我该如何解决吗?
谢谢。
【问题讨论】:
-
class是一个关键字。将成员重命名为其他名称。 -
除了
class是一个关键字这个明显的问题(并且在这里使用可能只是为了演示目的?),我第一眼看不出一个严重的问题。我认为,问题出在实际构造函数中的一些分配细节,也许是someBaseClass之一?请注意,静态初始化在输入main()之前运行,并且初始化不同静态对象的顺序未确定。所以,如果你有多个这样的对象并且它们甚至相互引用,请注意...... -
请发
Text类的代码。 -
你的例子确实没有给我们任何有用的信息。考虑到您说注释掉
playText的初始化会导致行为发生变化。您不认为向我们展示Text或至少是相关的Text::Text有助于追踪问题吗? -
在调试器下运行代码。否则,请发布足够的代码,以便人们可以编译、运行它并复制您的错误。
someBaseClass有虚拟析构函数吗?您的anotherClass实例是如何销毁的?
标签: c++ object static instantiation