C как обрабатывать malloc, возвращая NULL?выход () или отмена () - PullRequest
6 голосов
/ 26 ноября 2010

Когда malloc () завершается неудачно, что будет лучшим способом обработки ошибки?Если это не удается, я хочу немедленно выйти из программы, что я обычно делаю с помощью exit ().Но в этом особом случае я не совсем уверен, будет ли выход () подходить сюда.

Ответы [ 3 ]

13 голосов
/ 26 ноября 2010

В библиотечном коде абсолютно недопустимо вызывать exit или abort при любых обстоятельствах, кроме случаев, когда вызывающая сторона разорвала контакт с документированным интерфейсом вашей библиотеки.Если вы пишете библиотечный код, вы должны корректно обрабатывать любые ошибки выделения, освобождая любую память или другие ресурсы, полученные в результате предпринятой операции, и возвращая вызывающей стороне состояние ошибки.Вызывающая программа может затем решить exit, abort, отклонить любую команду, которую пользователь дал, которая требовала избыточной памяти, освободить некоторые ненужные данные и повторить попытку, или что-либо еще, что имеет смысл для приложения.

Во всехВ случаях, когда ваше приложение хранит данные, которые не были синхронизированы с диском и имеют потенциальную ценность для пользователя, вы должны приложить все усилия, чтобы не выбрасывать эти данные при сбоях выделения.Пользователь почти наверняка будет очень зол .Лучше спроектировать свои приложения так, чтобы функция «save» не требовала каких-либо выделений, но если вы не можете сделать это вообще, вместо этого вы можете захотеть выполнять частые операции автоматического сохранения в временный файл или предоставлятьспособ выгрузки содержимого памяти на диск в форме, которая не является стандартным форматом файла (который может, например, потребовать для записи уродливые библиотеки XML и ZIP, каждая со своими собственными потребностями выделения), а вместо этого - более «сырой дамп», который вы применяетеможет читать и восстанавливаться при следующем запуске.

5 голосов
/ 26 ноября 2010

Если malloc() возвращает NULL, это означает, что распределение было неудачным. Вам решать эту ошибку. Лично я считаю чрезмерным выход из всего процесса из-за неудачного размещения. Разобраться с этим другим способом.

1 голос
/ 26 ноября 2010

Использовать оба?


Зависит от того, будет ли полезен файл ядра.Если никто не собирается анализировать его, то вы можете просто _exit(2) или exit(3).

Если программа иногда будет использоваться локально, и вы намереваетесь анализировать любые созданные файлы ядра, то этоаргумент в пользу использования abort(3).

Вы всегда можете выбрать условно, поэтому при --debug используйте abort(3) и без него используйте exit.

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