Allocate
 
Отводит (назначает) блок памяти из свободного места

Синтакс

Declare Function Allocate cdecl ( ByVal count As Integer ) As Any Ptr

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

результат = Allocate( счёт (count) )

Параметры

count
Размер (в байтах) блок выделяемой памяти.

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

Если успешно, то возвращается адрес начала выделяемой памяти. Если безуспешно, т.е. запрашиваемый размер блока памяти не может быть выделен или если count < 0, то будет возвращён нулевой (пустой) указатель (0) .

Описание

Попытки выделить или зарезервировать count количества байт из свободной памяти (массы(heap)). Только что выделенная память не инициализируется.

Так как начальное значение вновь выделенной памяти не определено, Allocate нельзя использовать непосредственно с String или Udt содержащими строки, потому что дескриптор строки не очищен (содержит случайные данные), что может вызвать поврежденную строку или ещё что-нибудь (пытаясь записать в случайное место в памяти или пытаясь освободить случайный указатель). В этом случае (со строками или UDT, содержащими строки) обязательно следует использовать CAllocate (очищая память), или, в случае с UDT, New (вызывая конструктор), или же в худшем случае, после Allocate явно очистить дескриптор (установив на 0) перед использованием первой строки.

Возвращаемый указатель здесь - Any Ptr , указывающий на начало выделенной памяти. Этот указатель будет гарантированно уникальным, даже если count равен нулю.

Если выделенная память больше не нужна, её следует освободить с помощью Deallocate.

Пример

'' Эта программа использует функцию ALLOCATE(...) для создания буфера из 15 переменных integer. Затем этот буфер
'' заполняется первыми 15 числами последовательности Фибоначчи, и всё это выводится
'' на экран. Заметьте, что в конце прораммы происходит вызов функции DEALLOCATE(...).

    Const integerCount As Integer = 15

    '' Попробуем выделить память для a некоторого числа переменных integer.
    ''
    Dim buffer As Integer Ptr
    buffer = Allocate(integerCount * SizeOf(Integer))

    If (0 = buffer) Then
        Print "Error: unable to allocate memory, quitting."
        End -1
    End If

    '' Начинаем заполнять память последовательностью Фибоначчи.
    ''
    buffer[0] = 0
    buffer[1] = 1
    For i As Integer = 2 To integerCount - 1
        buffer[i] = buffer[i - 1] + buffer[i - 2]
    Next

    '' Выводим эту последовательность на экран.
    ''
    For i As Integer = 0 To integerCount - 1
        Print buffer[i] ;
    Next

    Deallocate(buffer)
    End 0

Результат:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
 

Важно освобождать выделенную память, если она не будет больше использоваться. Неиспользуемая память, которую не освободили, просто зря занимает место в памяти; и если адрес этой неосвобождённой памяти как-то переписан или оставлен без внимания, то потом эту часть памяти уже невозможно будет освободить. Это состояние известно как утечки памяти, и его следует избегать любой ценой. Стоит заметить, что утечка памяти всегда полностью освобождается, когда приложение завершается, либо через «обычный» выход, либо после аварийного завершения, так что утечка "сохраняется" только до тех пор,пока приложение запущено. Тем не менее, освобождение любой выделенной памяти в вашем приложении - хорошая привычка. Следующий пример демонстрирует функцию с утечкой памяти, где также адрес выделенной памяти теряется и больше не может быть освобожден. Если такая функция вызывается часто, общий объем потерянной памяти может быстро стать большим.

'' Плохой пример использования Allocate, вызывающий утечки памяти

Sub BadAllocateExample()

    Dim p As Byte Ptr

    p = Allocate(420)   '' назначить указатель - новой памяти

    p = Allocate(420)   '' переназначить тот же самый указатель другой памяти,
                        '' прежний адрес потерян и эта память стала утечкой

    Deallocate(p)

End Sub

    '' Main
    BadAllocateExample() '' Создаётся утечка памяти 
    Print "Memory leak!"
    BadAllocateExample() '' ... и ещё одна
    Print "Memory leak!"
    End


Различия платформ

  • Для данной процедуры безопасность потока не гарантированна.

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

  • Не доступна в диалекте-lang qb если только нет ссылки через alias __Allocate

Отличия от QB

  • Новая в FreeBASIC

См. также