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中看起来非常糟糕,那是什么?
答案 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()