Ошибка может быть обнаружена, когда:
malloc(n)
возвращает NULL
Это наиболее распространенный и надежный тест для обнаружения ошибки распределения.Если вы хотите быть портативным вне POSIX / SUS, я бы не стал доверять errno
.Если вам нужны подробности, скажем, для регистрации, я бы обнулил errno
перед вызовом, посмотрите, изменился ли он, а затем, возможно, запишите это.
malloc(n)
возвращает не-NULL
адрес, который не являетсяподдержанный фактической памятью
Коснитесь ее и посмотрите, не погибнет ли ОС.Да, это может случитьсяЭто называется переполнение памяти и напоминает банковские операции с частичным резервированием .Оптимистический подход ОС или гипервизора - возвращать адреса в виртуальную память, которую они играют, которую им никогда не придется предоставлять.Это происходит в Linux , VMware .(Я не могу найти никаких явных доказательств чрезмерной загрузки Windows, хотя запрашиваемые страницы «фиксируются» только при прикосновении к ним .)
Тогда возникает вопрос: «Как я могу определить, переносимо ли это?моя программа вот-вот рухнет при доступе к адресу, который я получил от malloc, которому я ранее доверял, как подростковая влюблённость? "Одним из способов может быть read()
случайный файл в тестовой области и посмотреть, возвращает ли ОС EINVAL или эквивалентный.
Для дополнительных точек,
malloc(0)
возвращает NULL
и оставляет errno
undefined
Я знаю вопрос, заданный для "ненулевого [размерного] блока памяти", но это интересно.Рассмотрим SUS-совместимый распределитель, который намеревается вернуть не-NULL
для выделения нулевого размера (он может это сделать), но затем произойдет сбой, поэтому он должен вернуть NULL
.И он может попытаться установить errno
.Это провал?Я думаю, что Хоар говорит, что мы заплатили миллиард долларов за эту двусмысленность.Таким образом, вызов malloc(0)
не является переносимым, и спрашивающий, вероятно, знал это!