FreeBasic New 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 New 关键字用于动态内存分配。它在堆上创建对象并返回指向已分配内存的指针。
基本定义
在 FreeBasic 中,New 在运行时为对象或数组分配内存。已分配的内存将一直存在,直到使用 Delete 显式释放。
当所需的内存大小在编译时未知或对象需要比其当前作用域更长久时,动态分配非常有用。妥善的内存管理对于避免内存泄漏至关重要。
分配单个对象
此示例显示了 New 分配单个整数的基本用法。
Dim p As Integer Ptr = New Integer *p = 42 Print "Value: "; *p Delete p
在这里,我们使用 New 为一个整数分配内存。我们存储返回的指针,通过它赋一个值,打印该值,最后使用 Delete 释放内存。请始终将 New 与 Delete 配对使用。
分配数组
New 可以通过在方括号中指定大小来分配数组。
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)。
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 在分配带有构造函数的对象时可以调用构造函数。
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 字符串通常会管理自己的内存。
Dim s As String Ptr = New String *s = "Dynamic string" Print *s Delete s
在这里,我们动态分配一个字符串对象。请注意,FreeBasic 字符串是引用计数的,因此很少需要这样做。该示例显示 New 可以与所有类型一起使用,包括像字符串这样的复杂类型。
指向指针的指针
New 可以分配指向指针的指针,这对于多维数组很有用。
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,它可以在预先分配的内存中构造一个对象。
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())并释放内存。这种高级技术用于自定义内存管理器和嵌入式系统。
最佳实践
- 内存管理:始终将
New与Delete配对使用。 - 数组:使用
Delete[]来解除数组分配。 - 初始化:优先使用构造函数初始化。
- 空指针检查:在分配后使用指针之前进行检查。
- RAII:考虑使用智能指针或包装器进行自动清理。
本教程通过实际示例介绍了 FreeBasic 的 New 关键字,展示了动态内存分配技术。