Из того, что я могу сказать, LHND
даже не является допустимым флагом для использования в версии Windows Mobile LocalAlloc
.
Когда вы вызываете немобильную версию LocalAlloc
с LMEM_MOVEABLE
, тип возврата - , а не INFO_STRUCT*
. Тип возвращаемого значения - HLOCAL
- дескриптор для выделенной памяти. Это не сам указатель, поэтому неправильно разыменовывать его как указатель. Чтобы получить указатель, вам нужно использовать LocalLock
, чтобы сообщить ОС, что в данный момент она не должна перемещать память.
Рассмотрим , что MSDN говорит о подвижной памяти :
Флаги подвижной памяти LHND, LMEM_MOVABLE и NONZEROLHND добавляют ненужные издержки и требуют безопасного использования блокировки. Их следует избегать, если в документации конкретно не указано, что их следует использовать.
Итак, если вам действительно нужно использовать LocalAlloc
, тогда выделите фиксированную память, а не подвижную. Это то же самое поведение, которое вы бы получили, если бы позвонили старому malloc
.
Флаг LMEM_MOVEABLE
означает что-то другое с LocalReAlloc
. Принимая во внимание, что LocalAlloc
указывает, заблокирована ли память, а LocalReAlloc
указывает, разрешено ли функции перемещать память, чтобы удовлетворить запрос на больший блок памяти. Если вы не включите этот флаг с LocalReAlloc
, то функция будет ограничена изменением размера блока на месте. Если там нет места, то функция завершится ошибкой, даже если где-то в куче будет больше блоков памяти.
Чтобы получить эффект malloc
, позвоните LocalAlloc(LMEM_FIXED)
. Чтобы получить эффект realloc
, звоните LocalReAlloc(LMEM_MOVEABLE)
. Включите LMEM_ZEROINIT
в любом случае, если хотите.
Одна вещь, которую нужно отнять от всего этого, это то, что вы должны использовать только те флаги, которые в документации конкретно указано, что вы можете использовать для каждой функции. Для LocalAlloc
не упоминается LMEM_MOVEABLE
, а для LocalReAlloc
не упоминается LPTR
.