ZetCode

FreeBasic Allocate 关键字

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

FreeBasic 的 Allocate 关键字用于程序执行期间的动态内存分配。它允许程序在运行时从堆请求内存。这对于灵活的数据结构至关重要。

基本定义

Allocate 保留指定大小的内存块并返回指向它的指针。分配的内存将一直保留,直到被 Deallocate 显式释放。这使得动态数据结构可以在需要时增长。

当所需的内存大小在编译时未知时,动态分配至关重要。它用于需要在使用过程中调整大小的数组、字符串和复杂数据结构。

基本内存分配

此示例显示了 Allocate 对单个整数的最简单用法。

allocate_basic.bas
Dim p As Integer Ptr
p = Allocate(SizeOf(Integer))

*p = 42
Print "Value at allocated memory: "; *p

Deallocate(p)

我们声明一个整数指针并为单个整数分配内存。SizeOf 运算符确保我们请求正确的数量。我们存储一个值,打印它,然后释放内存。请务リ始终释放内存以防止内存泄漏。

分配数组

Allocate 可以创建大小在运行时确定的动态数组。

allocate_array.bas
Dim size As Integer = 5
Dim arr As Integer Ptr
arr = Allocate(size * SizeOf(Integer))

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

Deallocate(arr)

这里我们为 5 个整数分配了一个数组。大小通过将元素计数乘以元素大小来计算。我们使用数组表示法访问元素。内存将在最后被正确释放。

分配字符串

字符串可以动态分配以处理可变长度的文本。

allocate_string.bas
Dim text As ZString Ptr
Dim length As Integer = 20

text = Allocate(length + 1)  ' +1 for null terminator
*text = "FreeBasic Tutorial"

Print "Allocated string: "; *text
Deallocate(text)

这为以 null 结尾的字符串分配了内存。我们将长度加 1 以用于 null 终止符。字符串被赋值并打印。ZString 指针用于与 C 风格的字符串兼容。

分配结构

像结构这样的复杂数据类型可以动态分配。

allocate_struct.bas
Type Person
    name As String
    age As Integer
End Type

Dim p As Person Ptr
p = Allocate(SizeOf(Person))

p->name = "John Doe"
p->age = 35

Print "Name: "; p->name
Print "Age: "; p->age

Deallocate(p)

我们定义了一个 Person 结构并为其中一个实例分配了内存。箭头运算符 (->) 通过指针访问结构成员。使用 SizeOf 正确计算了内存大小。

检查分配成功

在使用内存之前,请务必验证分配是否成功。

allocate_check.bas
Dim hugeArray As Integer Ptr
hugeArray = Allocate(1000000000 * SizeOf(Integer))

If hugeArray = 0 Then
    Print "Memory allocation failed!"
Else
    Print "Memory allocated successfully"
    Deallocate(hugeArray)
End If

这会尝试分配一个非常大的数组。如果分配失败,指针将为 null (0)。我们在使用内存之前检查此条件。这可以防止因 null 指针解引用而导致的崩溃。

调整已分配内存的大小

FreeBasic 允许使用 Reallocate 调整已分配内存块的大小。

allocate_resize.bas
Dim arr As Integer Ptr
Dim size As Integer = 3

arr = Allocate(size * SizeOf(Integer))
For i As Integer = 0 To size - 1
    arr[i] = i + 1
Next

' Need more space
size = 6
arr = Reallocate(arr, size * SizeOf(Integer))

For i As Integer = 3 To size - 1
    arr[i] = i + 1
Next

For i As Integer = 0 To size - 1
    Print arr[i];
Next
Print

Deallocate(arr)

我们首先为 3 个整数分配内存,然后调整大小以容纳 6 个。在重新分配期间,原始内容会得到保留。重新分配后,新元素会被初始化。请务必使用 Reallocate 返回的指针。

内存泄漏预防

此示例演示了正确的内存管理技术。

allocate_leak.bas
Sub ProcessData()
    Dim data As Integer Ptr = Allocate(100 * SizeOf(Integer))
    
    ' Simulate processing
    For i As Integer = 0 To 99
        data[i] = i
    Next
    
    ' Oops! Forgot to deallocate
    ' Deallocate(data) ' Uncomment to fix
End Sub

ProcessData()
Print "Memory leaked if not deallocated"

这显示了一个常见的内存泄漏场景。在子程序结束之前没有释放分配的内存。取消注释 Deallocate 行即可修复。请务必将分配与释放配对。

最佳实践

本教程介绍了 FreeBasic Allocate 关键字,并提供了演示动态内存管理技术的实际示例。

作者

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

列出所有 FreeBasic 教程