Предположим, у меня есть следующая строка в моем коде:

struct info *pinfo = malloc(sizeof(struct info));

Обычно есть еще одна строка кода, подобная этой:

if (!pinfo)
    <handle this error>

Но стоит ли это того? особенно если объект настолько мал, что сгенерированный для проверки код может потребовать больше памяти, чем сам объект.

1
Bite Bytes 3 Сен 2017 в 14:55

4 ответа

Лучший ответ

Но что, если malloc не работает? Вы будете разыменовывать указатель NULL, который является UB (неопределенное поведение), и ваша программа (вероятно) потерпит неудачу!

Иногда код, который проверяет правильность данных, длиннее, чем код, который что-то с этим делает :).

1
Jonathan Leffler 3 Сен 2017 в 16:28

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

Когда вы включите его в свою программу реального мира, добавьте всю необходимую проверку и обработку ошибок.

0
Paul Ogilvie 3 Сен 2017 в 14:37

Если malloc завершится неудачей, скорее всего, системе не хватает памяти или что-то еще, что ваша программа не может обработать. Следует немедленно прервать и, самое большее, записать некоторые диагностические данные. Если вы не справитесь с NULL из malloc, вы окажетесь в стране неопределенного поведения. Кто-то может возразить, что необходимость прерывания из-за сбоя malloc уже катастрофична, но просто позволить ему показать UB попадает в худшую категорию.

3
Sombrero Chicken 3 Сен 2017 в 11:59

Это очень просто, если вы не будете проверять NULL, вы можете получить ошибку во время выполнения. Проверка NULL поможет вам избежать непредвиденного сбоя программы и корректно обработать ошибку.

0
Artem Barger 3 Сен 2017 в 12:01