Проверка на возвращение malloc
сама по себе не поможет вам сделать ваши ассигнования более безопасными или менее подверженными ошибкам. Это может быть даже ловушка, если это единственный тест, который вы реализуете.
При вызове с аргументом 0
стандарт позволяет malloc
возвращать своего рода уникальный адрес, который не является нулевым указателем и к которому у вас, тем не менее, нет права доступа. Поэтому, если вы просто проверяете, является ли возвращаемое значение 0
, но не проверяете аргументы для malloc
, calloc
или realloc
, вы можете столкнуться с segfault намного позже.
Это состояние ошибки (нехватка памяти) встречается довольно редко в «размещенных» средах. Обычно вы сталкиваетесь с проблемами задолго до того, как начинаете беспокоиться об ошибках такого рода. (Но если вы пишете библиотеки времени выполнения, являетесь ли вы хакером ядра или сборщиком ракет, это не так, и в этом тесте есть смысл.)
Затем люди склонны украшать свой код сложными перехватами этого состояния ошибки, которое занимает несколько строк, выполняя perror
и тому подобное, что может повлиять на читабельность кода.
Я думаю, что этот "чек на возвращение malloc
" сильно преувеличен, иногда даже защищен довольно догматично. Другие вещи гораздо важнее:
- всегда инициализировать переменные, всегда. для переменных-указателей это очень важно,
пусть программа красиво рухнет, пока все не стало слишком плохо. Члены неинициализированного указателя в
struct
являются важной причиной ошибок, которые трудно найти.
- всегда проверяйте аргумент для
malloc
и Co, если это компиляция
постоянная времени вроде sizof toto
не может быть проблемой, но
всегда проверяйте, правильно ли ваше распределение векторов обрабатывает нулевой регистр.
Легкая вещь для проверки возврата malloc
- это обернуть его чем-то вроде memset(malloc(n), 0, 1)
. Это просто записывает 0
в первый байт и хорошо вылетает, если malloc
имел ошибку или n
было 0
для начала.