Reallocate
 
Перераспределяет память для существующего зарезервированного блока памяти

Синтаксис

Declare Function Reallocate cdecl ( ByVal pointer As Any Ptr, ByVal count As Integer ) As Any Ptr

Использование

result = Reallocate( pointer, count )

Параметры

pointer
Адрес выделенной памяти для перераспределения памяти.
count
Кол-во байт для нового перераспределения памяти.

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

Адрес перераспределенной памяти. Возвращается нулевой (0) указатель, если перераспределение потерпело неудачу, при этом оригинальная память, на которую указывает pointer остается неизменной.

Описание

Попытка перераспределить, или изменить размер памяти, выделенной ранее с Allocate или CAllocate. Содержимое буфера сохраняется. Если count меньше, чем исходный размер блока памяти, буфер будет усечен. В случае увеличения размера памяти диапазон добавленной памяти не инициализирован.

При использовании с String или Udt содержащего string, и если count больше, чем исходный размер блока памяти, новая дополнительная память должна быть явно очищена (значением 0) перед первым использованием string (например при помощи Clear), в противном случае дескриптор не очищенной строки (содержащий случайные данные) может вызвать повреждение строки или более того (попытку написать в случайное место в памяти или попытку освободить случайный указатель).

Если pointer равен нулю (0), тогда ReAllocate ведет себя как Allocate.

Если pointer действителен , а count равен нулю (0), тогда ReAllocate ведет себя как Deallocate и возвращается нулевой (0) указатель.

Перераспределенная память должна быть освобождена, или освобождена при помощи Deallocate , когда память более не требуется.

Эта функция не является частью RinTime библиотеки FreeBASIC, это псевдоним для библиотеки C RinTime realloc, поэтому нет гарантии потокобезопасности на всех платформах.

Примечание: Перераспределение указателя внутри объекта функции, когда этот указатель содержит родительский объект функции, является неопределенным и это может привести к вылету программы.

Пример

Dim a As Integer Ptr, b As Integer Ptr, i As Integer

a = Allocate( 5 * SizeOf(Integer) )   ' Выделение памяти для 5 integers

If a = 0 Then Print "Error Allocating a": End

For i = 0 To 4
  a[i] = (i + 1) * 2   ' Присвоение целых чисел в буфер
Next i

b = Reallocate( a, 10 * SizeOf(Integer) )   ' Перераспределяем память для 5 дополнительных integers

If b <> 0 Then

    a = b

    For i = 5 To 9
      a[i] = (i + 1) * 2   Присвоение других целых чисел в буфер
    Next i

    For i = 0 To 9   ' Печатаем integers
      Print i, a[i]
    Next i
    Print

Else '' Перераспределение потерпело неудачу, память без изменений

    Print "Error Reallocating a"

    For i = 0 To 4   ' Печатаем integers
      Print i, a[i]
    Next i
    Print

End If

Deallocate a   ' Очистка


Различие диалектов

  • Не доступно в диалекте -lang qb , но есть псевдоним __Reallocate.

Отличия от QB

  • Новое в FreeBASIC

См. также