Имеют ли классы с неинициализированными указателями неопределенное поведение? - PullRequest
1 голос
/ 06 августа 2010
class someClass
{
public:
    int* ptr2Int;
};

Это допустимый класс (да, он компилируется)? При условии, что перед назначением разыменования присваивается значение ptr2Int, гарантированно ли работает класс, как и следовало ожидать?

Ответы [ 4 ]

5 голосов
/ 06 августа 2010

Неинициализированный указатель внутри класса ничем не отличается от автономного неинициализированного указателя. Пока вы не используете указатель каким-либо опасным способом, у вас все в порядке.

Имейте в виду, что "опасные способы" использования неинициализированного указателя включают в себя простую попытку прочитать его значение (разыменование не требуется). Представленные в вашем классе неявные предоставленные компилятором операторы копирования и назначения копирования могут выполнить такую ​​попытку, если вы используете эти неявные функции-члены до того, как указателю будет присвоено допустимое значение.

На самом деле, если я не ошибаюсь, этот вопрос был предметом некоторого обсуждения на уровне комитета по стандартизации. Разрешено ли неявно сгенерированным функциям-членам обходить представления ловушек, возможно, присутствующие в неинициализированных членах класса? Я не помню, какой был приговор. (Или, может быть, я видел это обсуждение в контексте C99?)

1 голос
/ 06 августа 2010

Да, это точно так же, как struct с одним неинициализированным указателем, и оба гарантированно будут работать нормально (конечно, если вы установите указатель перед любым его использованием).

1 голос
/ 06 августа 2010

Да, все в порядке.Сам указатель существует, просто его значение просто неизвестно, поэтому разыменование его небезопасно.Иметь неинициализированную переменную совершенно нормально, а указатели ничем не отличаются

0 голосов
/ 06 августа 2010

Пока вы не разыграете указатель, все хорошо, тогда это неопределенная территория.

Некоторые компиляторы устанавливают указатели на значения по умолчанию (например, null) в зависимости от того, компилируете ли вы в режиме отладки или выпуска. Так что все может работать в одном режиме, и внезапно все разваливается в другом.

...