PureBasic

ReAllocateMemory()

Синтаксис

*NewMemoryID = ReAllocateMemory(*MemoryID , Size [, Flags])

Описание


Изменяет размер указанного существующего буфера памяти на новый. В процессе этого, буфер может быть перенесён в новое местоположение в адресном пространстве, если в его текущем местоположении недостаточно памяти для обеспечения непрерывности буфера.

Параметры

*MemoryID Адрес буфера, размер которого требуется изменить. Это значение может быть получено в результате вызова функций AllocateMemory() или ReAllocateMemory().

Если этот параметр - 0 (#Null), команда действует как AllocateMemory() и выделяет новую область памяти (новый буфер) заданного размера.
Size Целевой размер в байтах для изменения существующего или выделения нового буфера.
Flags (дополн.) Этот параметр может быть одним из следующих значений:
  #PB_Memory_NoClear: Не заполнять область добавленной памяти нулями. Это может помочь ускорить выделение, если
                      добавленная память требуется немедленно. Если размер памяти уменьшается, этот флаг не действует.

Возвращаемое значение

Возвращает новый адрес буфера, если его размер был успешно изменён. В этом случае старый адрес '*MemoryID' больше не действителен и не может использоваться. Если изменить размер буфера не удалось (например доступной памяти недостаточно), результат будет равен нулю, а старый адрес '*MemoryID' по-прежнему будет действителен с существующим буфером и старым размером.

Комментарии

Прежнее содержимое области памяти (буфера) по указателю '*MemoryID' не теряется. Если новый размер буфера 'size' меньше прежнего, хвост отрезается. Если новый размер 'size' больше прежнего, добавочная память заполняется нулями (если не указан флаг #PB_Memory_NoClear).

Если программа даёт сбой при этой команде, даже при том, что вводимое значение кажется корректным, это обычно является результатом повреждения данных в памяти программы в более раннее время, например при записи в память за пределами выделенной области памяти. Реальная причина такой ошибки может быть найдена с помощью средства отладчика Пурифаер.

При завершении программы все выделенные области памяти освобождаются автоматически.

Пример

*MemoryID = AllocateMemory(1000)
PokeS(*MemoryID, "Store this string")
; добавьте сюда что нибудь своё...
;
*NewMemoryID = ReAllocateMemory(*MemoryID, 2000) ; Нужно больше памяти...
If *NewMemoryID
    ; *NewMemoryID теперь работает с размером 2000 байт
    Debug "Старое содержимое все еще доступно:"
    Debug PeekS(*NewMemoryID)
    ;
    FreeMemory(*NewMemoryID)
Else
    ; Изменение размера не сработало, продолжайте работать с  *MemoryID (размер 1000 байт)
    ;
    FreeMemory(*MemoryID)
EndIf

См. также

AllocateMemory(), FreeMemory(), MemorySize()

Поддерживаемые OS

Все

<- PokeW() - Оглавление Memory