ZetCode

FreeBasic New 关键字

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

FreeBasic 的 New 关键字用于动态内存分配。它在堆上创建对象并返回指向已分配内存的指针。

基本定义

在 FreeBasic 中,New 在运行时为对象或数组分配内存。已分配的内存将一直存在,直到使用 Delete 显式释放。

当所需的内存大小在编译时未知或对象需要比其当前作用域更长久时,动态分配非常有用。妥善的内存管理对于避免内存泄漏至关重要。

分配单个对象

此示例显示了 New 分配单个整数的基本用法。

new_single.bas
Dim p As Integer Ptr = New Integer
*p = 42

Print "Value: "; *p

Delete p

在这里,我们使用 New 为一个整数分配内存。我们存储返回的指针,通过它赋一个值,打印该值,最后使用 Delete 释放内存。请始终将 NewDelete 配对使用。

分配数组

New 可以通过在方括号中指定大小来分配数组。

new_array.bas
Dim size As Integer = 5
Dim arr As Integer Ptr = New Integer[size]

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

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

Delete[] arr

这会分配一个包含 5 个整数的数组。请注意,我们使用 Delete[] 来解除数组分配。数组元素的访问是通过指针算术或数组表示法完成的。内存是连续的,就像静态数组一样。

分配用户定义类型

New 可以像内置类型一样使用用户定义类型 (UDT)。

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

Dim p As Person Ptr = New Person
p->name = "Alice"
p->age = 30

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

Delete p

我们分配一个 Person 对象,并使用 -> 运算符访问其成员。语法与 C/C++ 类似。UDT 分配对于 FreeBasic 中的面向对象编程至关重要。

构造函数初始化

New 在分配带有构造函数的对象时可以调用构造函数。

new_constructor.bas
Type Vector
    x As Single
    y As Single
    
    Declare Constructor()
    Declare Constructor(x As Single, y As Single)
End Type

Constructor Vector()
    this.x = 0
    this.y = 0
End Constructor

Constructor Vector(x As Single, y As Single)
    this.x = x
    this.y = y
End Constructor

Dim v1 As Vector Ptr = New Vector
Dim v2 As Vector Ptr = New Vector(3.5, 4.2)

Print "v1: ("; v1->x; ", "; v1->y; ")"
Print "v2: ("; v2->x; ", "; v2->y; ")"

Delete v1
Delete v2

这演示了与 New 一起使用的构造函数调用。第一次分配使用默认构造函数,第二次则将参数传递给参数化构造函数。构造函数可确保对象得到正确初始化。

动态字符串

字符串可以动态分配,尽管 FreeBasic 字符串通常会管理自己的内存。

new_string.bas
Dim s As String Ptr = New String
*s = "Dynamic string"

Print *s

Delete s

在这里,我们动态分配一个字符串对象。请注意,FreeBasic 字符串是引用计数的,因此很少需要这样做。该示例显示 New 可以与所有类型一起使用,包括像字符串这样的复杂类型。

指向指针的指针

New 可以分配指向指针的指针,这对于多维数组很有用。

new_pointer_to_pointer.bas
Dim pp As Integer Ptr Ptr = New Integer Ptr[3]

For i As Integer = 0 To 2
    pp[i] = New Integer[4]
    For j As Integer = 0 To 3
        pp[i][j] = i * 10 + j
    Next
Next

For i As Integer = 0 To 2
    For j As Integer = 0 To 3
        Print pp[i][j]; " ";
    Next
    Print
Next

For i As Integer = 0 To 2
    Delete[] pp[i]
Next
Delete[] pp

这通过首先分配一个指针数组,然后分配每一行来创建一个二维数组。请注意嵌套的清理过程——在删除指针数组之前必须删除每一行。这种模式对于不规则数组很常见。

定位 new

FreeBasic 支持定位 new,它可以在预先分配的内存中构造一个对象。

new_placement.bas
Type Test
    value As Integer
    Declare Constructor(v As Integer)
End Type

Constructor Test(v As Integer)
    this.value = v
End Constructor

Dim buffer As Byte Ptr = Allocate(SizeOf(Test))
Dim t As Test Ptr = New(buffer) Test(42)

Print "Value: "; t->value

t->~Test()
Deallocate(buffer)

定位 new 在现有内存(buffer)中构造一个对象。我们必须手动调用析构函数(~Test())并释放内存。这种高级技术用于自定义内存管理器和嵌入式系统。

最佳实践

本教程通过实际示例介绍了 FreeBasic 的 New 关键字,展示了动态内存分配技术。

作者

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

列出所有 FreeBasic 教程