C ++ конструкция странный неинициализированный указатель - PullRequest
0 голосов
/ 05 ноября 2008
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
}

в соответствующей заметке, моноширинный шрифт выглядит действительно ужасно в chrome, что с этим?

Ответы [ 3 ]

4 голосов
/ 05 ноября 2008

alertText может отображаться в виде строки в отладчике, но он еще не создан (и поэтому alertText.c_str () вернет неопределенный указатель).

Чтобы избежать этого, можно инициализировать использование text.c_str () в качестве аргумента для ctor-объекта IMEvent.

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
}
2 голосов
/ 05 ноября 2008

Конструктор IMEvent вызывается до вызова конструктора alertText. В частности, поэтому его аргумент alertText.c_str() оценивается до вызова конструктора alertText. Это не хорошо.

Выражения инициализатора вызываются в том порядке, в котором объявляются инициализируемые объекты (не обязательно в порядке, в котором перечислены инициализаторы). Итак, сначала родительские классы, затем члены. Компиляторы иногда предупреждают вас, если вы не перечислите инициализаторы в том порядке, в котором они будут фактически выполняться. Таким образом, при условии, что вы получите это право, правило «не используйте ничего, что вы не инициализировали». Этот код использует alertText до его инициализации.

1 голос
/ 05 ноября 2008

Конструктор IMEvent вызывается до вызова конструктора alertText.

Почти. alertText.c_str() вызывается до создания alertText, что является настоящей проблемой. Самое простое решение - заменить его на text.c_str()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...