Освобождает ранее выделенную память
Синтаксис
Использование
Deallocate( pointer )
Параметры
pointer
адрес, ранее выделенного буфера.
Описание
Эта процедура освобождает память, которая была ранее выделены с помощью
Allocate.
pointer
должен быть действительным указателем. После возврата процедуры,
pointer
будет признан недействительным (указывая на неправильный адрес памяти), и
его использование приведет к непредсказуемому поведению.
Deallocate является псевдонимом для
free из C runtime библиотеки, так что не гарантируется
потокобезопасность на всех платформах.
Пример
В следующем примере показано, как освободить ранее выделенную память.
Обратите внимание, что указатель устанавливается в значение null после
освобождения:
Sub DeallocateExample1()
Dim As Integer Ptr integerPtr = Allocate( Len( Integer ) ) '' инициализировать
указатель на
'' новый
адрес в памяти
*integerPtr = 420 '' использование
указателя
Print *integerPtr
Deallocate( integerPtr ) '' освободить
память обратно в систему
integerPtr = 0 '' и
обнулить указатель
End Sub
DeallocateExample1()
End 0
Хотя в данном случае это ненужно, поскольку функция немедленно завершает
работу после того, как указатель устанавливается в null , все таки это
хорошая привычка. Если функция освобождает память указателя, который был
передан в качестве ссылки, например, указатель, который был использован в
вызове функции, будет признан недействительным, и будет неплохо установить
его в нуль. Пример 3 показывает, как правильно обращаться с этим видом
ситуации, а следующий пример показывает эффекты освобождая памяти с
несколькими ссылками.
В следующем примере, другой указатель используется, чтобы освободить ранее
выделенную память.
'' Предупреждение: "Плохой" пример, показывающий,
как все не должно быть сделано
Sub DeallocateExample2()
Dim As Integer Ptr integerPtr = Allocate( Len( Integer ) )
'' инициализация ^^^ указателя
на новую память
Dim As Integer Ptr anotherIntegerPtr = integerPtr
'' инициализация ^^^ указателя
на эту же память
*anotherIntegerPtr = 69 '' использование
другого указателя
Print *anotherIntegerPtr
Deallocate( anotherIntegerPtr ) '' освободить
память обратно в систему
anotherIntegerPtr = 0 '' и
обнулить указатель
'' *integerPtr = 420 '' неопределенное
поведение оригинального указателя.
'' указатель
является недействительным
End Sub
DeallocateExample2()
End 0
Обратите внимание, что после освобождения памяти, оба указателя
недействительные. Это иллюстрирует еще один из способов, в котором ошибки
могут возникать при работе с указателями. Как правило, нужно только
освободить память ранее выданного, когда вы знаете, что есть только один (1)
указатель реально указывающий на него.
Function createInteger() As Integer Ptr
Return Allocate( Len( Integer ) ) '' возвращает
указатель на новую
End Function '' выделенную
память
Sub destroyInteger( ByRef someIntegerPtr As Integer Ptr )
Deallocate( someIntegerPtr ) '' освобождает
память обратно в систему
someIntegerPtr = 0 '' и
обнуляет указатель
End Sub
Sub DeallocateExample3()
Dim As Integer Ptr integerPtr = createInteger() '' инициализировать
указатель на
'' новый
адрес памяти
*integerPtr = 420 '' использовать
указатель
Print *integerPtr
destroyInteger( integerPtr ) '' передать
указатель по ссылке
Assert( integerPtr = 0 ) '' теперь
указатель должен быть нулевым
End Sub
DeallocateExample3()
End 0
В приведенной выше программе, указатель, переданный по ссылке в функцию
установлен в нуль после освобождения памяти. Макрос
Assert
используется для проверки, чтобы выяснить является ли оригинальный указатель
на самом деле нулевым после вызова функции. Из этого примера следует, как
правильно передавать указатели в функции и освобождать память на которую они
указывают.
Различия диалектов
- не доступно в диалекте -lang qb
, но есть псевдоним __Deallocate.
Отличия от QB
См. также