Почему указатели не инициализируются с NULL по умолчанию? - PullRequest
108 голосов
/ 16 декабря 2009

Может кто-нибудь объяснить, почему указатели не инициализируются до NULL?
Пример:

  void test(){
     char *buf;
     if (!buf)
        // whatever
  }

Программа не будет входить в if, потому что buf не равно нулю.

Я хотел бы знать, почему, в каком случае нам нужна переменная с включенным мусором, особенно указатели, обращающиеся к мусору в памяти?

Ответы [ 15 ]

0 голосов
/ 16 декабря 2009

О, мальчик. Реальный ответ заключается в том, что легко обнулить память, что является основной инициализацией, скажем, указателя. Что также не имеет ничего общего с инициализацией самого объекта.

Учитывая предупреждения, которые большинство компиляторов выдают на самых высоких уровнях, я не могу представить программирование на самом высоком уровне и рассматривать их как ошибки. Поскольку их включение никогда не спасло меня ни от одной ошибки в огромном количестве созданного кода, я не могу этого порекомендовать.

0 голосов
/ 16 декабря 2009

О каких именно указателях вы говорите?

Для обеспечения исключительной безопасности всегда используйте auto_ptr, shared_ptr, weak_ptr и другие их варианты.
Отличительной чертой хорошего кода является тот, который не включает ни одного звонка на delete.

0 голосов
/ 16 декабря 2009

C ++ происходит из C-фона - и есть несколько причин, по которым он может вернуться:

C, даже больше, чем C ++, является заменой на ассемблере. Он не делает ничего, что вы не говорите ему делать. Поэтому: если вы хотите NULL, сделайте это!

Кроме того, если вы обнуляете что-то на голом железном языке, таком как C, автоматически возникают вопросы о согласованности: если вы что-то неправильно используете, должно ли это автоматически обнуляться? Как насчет структуры, созданной в стеке? все байты должны быть обнулены? Как насчет глобальных переменных? как насчет выражения типа "(* 0x18);" не значит ли это, что позиция памяти 0x18 должна быть обнулена?

0 голосов
/ 16 декабря 2009

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

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

Ради здравого смысла всегда инициализируйте указатели на NULL, таким образом, если любая попытка разыменовать его без malloc или new укажет программисту причину неправильного поведения программы.

Надеюсь, что это помогает и имеет смысл, С наилучшими пожеланиями, Том.

0 голосов
/ 16 декабря 2009

Ну, если бы C ++ действительно инициализировал указатели, то люди из C, жалующиеся на "C ++ медленнее, чем C", имели бы что-то реальное, за что можно держаться;)

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