Пустые объекты памяти
Q: Что делает malloc(0) ? Что относительно free(NULL)?
A: Эти на вид простые вопросы имеют удивительно сложные ответы, особенно при обобщении их для покрытия другого управления памятью Mac OS APIs. Таблица 1 и Таблица 2 перечисляют некоторые обычно используемые подпрограммы и их поведение в этих случаях.
Подпрограмма | Платформа | Возвраты |
|---|---|---|
malloc | ANSI C спецификация | или NULL или указатель на блок нулевой длины |
malloc | Системная платформа Mac OS X | указатель на блок нулевой длины |
malloc | CodeWarrior MSL | НУЛЬ [1] [2] |
CFAllocatorAllocate | все | НУЛЬ [3] |
NewPtr | все | указатель на блок нулевой длины |
NewHandle | все | дескриптор к блоку нулевой длины |
MPAllocateAligned | Mac OS X | указатель на блок нулевой длины |
MPAllocateAligned | традиционный Mac OS | НУЛЬ |
OTAllocMem[InContext] | все | указатель на блок нулевой длины |
оператор, новый [] | Спецификация C++ ANSI | указатель на блок нулевой длины |
оператор, новый [] | все | указатель на блок нулевой длины |
Подпрограмма | Платформа | Поведение |
|---|---|---|
свободный | ANSI C спецификация | ничего не делает |
свободный | все | ничего не делает [1] |
CFAllocatorDeallocate | все | ничего не делает [4] |
DisposePtr | Mac OS X | наборы MemErr к noErr |
DisposePtr | традиционный Mac OS, PowerPC | наборы MemErr к noErr |
DisposePtr | традиционный Mac OS, 68K | недопустимый |
DisposeHandle | Mac OS X | наборы MemErr к nilHandleErr |
DisposeHandle | традиционный Mac OS | наборы MemErr к noErr |
MPFree | Mac OS X | недопустимый [5] |
MPFree | традиционный Mac OS | ничего не делает |
OTFreeMem | все | ничего не делает |
оператор удаляет | Спецификация C++ ANSI | ничего не делает |
оператор удаляет | все | ничего не делает |
Примечания:
Информация о MSL получена из CodeWarrior Pro 8.3 MSL.
Можно изменить это поведение путем установки
_MSL_MALLOC_0_RETURNS_NON_NULLпеременная времени компиляции и восстановление MSL.Это поведение является частью
CFAllocatorAllocateи независимо от фактического используемого средства выделения.Это поведение является частью
CFAllocatorDeallocateи независимо от фактического используемого средства выделения.На текущих версиях Mac OS X (10.2 и ранее), это не разрушит, но вместо этого распечатает предупреждающее сообщение к консоли (r. 3227311).
История версии документа
| Дата | Примечания |
|---|---|
| 26.07.2011 | Переформатированное содержание и внесло незначительные редакционные изменения. |
| 21.04.2003 | Новый документ, описывающий, как два граничных случая управления памятью обрабатываются общими средствами выделения памяти Mac OS. |