C ++构造奇怪的未初始化指针

时间:2008-11-04 23:43:34

标签: c++

AlertEvent::AlertEvent(const std::string& text) :
    IMEvent(kIMEventAlert, alertText.c_str()),
    alertText(text)
{
    //inspection at time of crash shows alertText is a valid string
}


IMEvent::IMEvent(long eventID, const char* details)
{
    //during construction, details==0xcccccccc
}

在相关的说明中,monospace字体在chrome中看起来非常糟糕,那是什么?

3 个答案:

答案 0 :(得分:4)

alertText可能在调试器中显示为字符串,但尚未构造(因此alertText.c_str()将返回一个不确定的指针)。

为避免这种情况,可以初始化使用text.c_str()作为IMEvent ctor的参数。

AlertEvent::AlertEvent(const std::string& text) :
    IMEvent(kIMEventAlert, text.c_str()),
    alertText(text)
{
    //inspection at time of crash shows alertText is a valid string
}


IMEvent::IMEvent(long eventID, const char* details)
{
    //during construction, details==0xcccccccc
}

答案 1 :(得分:2)

在调用alertText的构造函数之前调用IMEvent构造函数。因此,特别是在调用alertText的构造函数之前评估它的参数alertText.c_str()。这不好。

初始化表达式按声明初始化事物的顺序调用(不一定是列出初始值设定项的顺序)。所以父类首先是成员。如果您没有按照实际执行的顺序列出初始化程序,编译器有时会提醒您。所以如果你做对了,规则是“不要使用你没有初始化的任何东西”。此代码在初始化之前使用alertText。

答案 2 :(得分:1)

在调用alertText的构造函数之前调用IMEvent构造函数。

几乎。在构造alertText之前调用alertText.c_str(),这是真正的问题。最简单的解决方案是将其替换为text.c_str()