ZetCode

FreeBasic Deallocate 关键字

最后修改日期:2025 年 6 月 16 日

FreeBasic 的 Deallocate 关键字用于释放动态分配的内存。它与使用 AllocateCallocate 创建的指针一起工作。正确的内存管理可防止内存泄漏。

基本定义

Deallocate 释放先前分配给指针的内存。它将内存标记为可供其他用途使用。未能释放内存会导致程序中出现内存泄漏。

该关键字将一个指针变量作为其参数。释放后,指针将失效,不应再使用。为安全起见,请始终在释放后将指针设置为 null。

基本释放

此示例展示了 Deallocate 关键字的最简单用法。

deallocate_basic.bas
Dim p As Integer Ptr
p = Allocate(SizeOf(Integer))
*p = 42

Print "Value before deallocation: "; *p

Deallocate(p)
p = 0 ' Good practice to null the pointer

' *p would now cause an error if accessed
Print "Memory has been freed"

在这里,我们为整数分配内存,存储一个值,然后释放它。之后将指针设置为 null。尝试在释放后使用指针将导致未定义行为。

释放数组

动态数组必须正确释放,以防止内存泄漏。

deallocate_array.bas
Dim arr As Integer Ptr
arr = Allocate(10 * SizeOf(Integer))

For i As Integer = 0 To 9
    arr[i] = i * 10
    Print arr[i]; " ";
Next
Print

Deallocate(arr)
arr = 0

此代码为 10 个整数分配内存,用值填充它们,然后释放内存。在 FreeBasic 中,数组式访问可以与指针一起使用。数组不再需要时,请务必释放它们。

在函数中释放

函数中分配的内存应妥善管理,以避免泄漏。

deallocate_function.bas
Function CreateBuffer(size As Integer) As Byte Ptr
    Return Allocate(size)
End Function

Dim buffer As Byte Ptr = CreateBuffer(100)
Print "Buffer created with size 100"

' Use the buffer here...

Deallocate(buffer)
buffer = 0
Print "Buffer freed"

这演示了跨函数的内存管理。该函数分配内存,调用者最终必须释放该内存。清晰地记录谁拥有内存以及谁负责释放它。

释放前检查

在释放指针之前进行检查是一种良好的做法。

deallocate_check.bas
Dim ptr As String Ptr = 0

' Only allocate if needed
If SomeCondition Then
    ptr = Allocate(100)
End If

' Safely deallocate
If ptr Then
    Deallocate(ptr)
    ptr = 0
End If

此示例展示了使用指针进行防御性编程。我们在释放之前检查指针是否为非 null。这可以防止因重复释放或释放 null 指针而导致的崩溃。

释放结构

具有嵌套分配的复杂结构需要仔细释放。

deallocate_structure.bas
Type Person
    name As String Ptr
    age As Integer Ptr
End Type

Dim p As Person Ptr = Allocate(SizeOf(Person))
p->name = Allocate(50)
p->age = Allocate(SizeOf(Integer))

' Use the structure...

Deallocate(p->name)
Deallocate(p->age)
Deallocate(p)
p = 0

释放具有指针成员的结构时,请先释放成员。然后释放结构本身。这可以防止具有多个分配的复杂数据结构中的内存泄漏。

Deallocate 与 Erase

对于动态数组,DeallocateErase 不同。

deallocate_vs_erase.bas
' Dynamic array using Redim
Dim array() As Integer
Redim array(0 To 9)

' Pointer-based array
Dim parray As Integer Ptr = Allocate(10 * SizeOf(Integer))

' Free them differently
Erase array ' For dynamic arrays
Deallocate(parray) ' For pointer arrays
parray = 0

这显示了释放指针数组和擦除动态数组之间的区别。Erase 用于使用 DimRedim 创建的动态数组,而 Deallocate 用于基于指针的分配。

内存泄漏检测

正确的释放有助于防止长时间运行的程序中的内存泄漏。

deallocate_leak.bas
Sub ProcessData()
    Dim data As Byte Ptr = Allocate(1024)
    ' ... use data ...
    Deallocate(data) ' Comment this to create a leak
    data = 0
End Sub

For i As Integer = 1 To 100
    ProcessData()
Next

Print "Memory operations complete"

这演示了忘记释放会导致泄漏。每次调用都会分配内存;如果不释放,内存使用量就会增加。如果可能,请始终在分配内存的同一作用域中释放内存。

最佳实践

本教程介绍了 FreeBasic 的 Deallocate 关键字,并通过实际示例展示了正确的内存管理技术。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 FreeBasic 教程