Deallocate
 
Освобождает ранее выделенную память

Синтаксис

Declare Sub Deallocate cdecl ( ByVal pointer As Any Ptr )

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

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

  • Новое в FreeBASIC

См. также