Перераспределяет память для существующего зарезервированного блока памяти
Синтаксис
Использование
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
См. также