Технические вопросы и ответы QA1259

Пустые объекты памяти

Q: Что делает malloc(0) ? Что относительно free(NULL)?

A: Эти на вид простые вопросы имеют удивительно сложные ответы, особенно при обобщении их для покрытия другого управления памятью Mac OS APIs. Таблица 1 и Таблица 2 перечисляют некоторые обычно используемые подпрограммы и их поведение в этих случаях.

Таблица 1  , Выделяющая блок нулевых байтов

Подпрограмма

Платформа

Возвраты

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

указатель на блок нулевой длины

оператор, новый []

все

указатель на блок нулевой длины

Таблица 2  Освобождая Указателя Нулевого

Подпрограмма

Платформа

Поведение

свободный

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

ничего не делает

оператор удаляет

все

ничего не делает

Примечания:

  1. Информация о MSL получена из CodeWarrior Pro 8.3 MSL.

  2. Можно изменить это поведение путем установки _MSL_MALLOC_0_RETURNS_NON_NULL переменная времени компиляции и восстановление MSL.

  3. Это поведение является частью CFAllocatorAllocate и независимо от фактического используемого средства выделения.

  4. Это поведение является частью CFAllocatorDeallocate и независимо от фактического используемого средства выделения.

  5. На текущих версиях Mac OS X (10.2 и ранее), это не разрушит, но вместо этого распечатает предупреждающее сообщение к консоли (r. 3227311).



История версии документа


ДатаПримечания
26.07.2011

Переформатированное содержание и внесло незначительные редакционные изменения.

21.04.2003

Новый документ, описывающий, как два граничных случая управления памятью обрабатываются общими средствами выделения памяти Mac OS.