ZetCode

FreeBasic Delete 关键字

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

FreeBasic 的 Delete 关键字用于释放先前使用 New 分配的内存。对于使用动态内存分配的程序,它是正确内存管理的关键。

基本定义

在 FreeBasic 中,Delete 是一个运算符,用于释放为单个对象或对象数组分配的内存。它会在将内存释放回系统之前调用对象的析构函数(如果有)。

正确使用 Delete 可以防止使用动态内存分配的应用程序中出现内存泄漏。它应始终与相应的 New 操作配对使用。

删除单个对象

此示例显示了 Delete 与单个对象的基本用法。

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

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

Print p->name; " is "; p->age; " years old"

Delete p

在这里,我们使用 New 动态创建一个 Person 对象。在使用该对象后,我们使用 Delete 释放其内存。指针 p 在删除后失效,不应再使用。

删除数组

Delete[] 用于释放使用 New[] 创建的数组的内存。

delete_array.bas
Dim numbers As Integer Ptr = New Integer[5]

For i As Integer = 0 To 4
    numbers[i] = i * 10
    Print numbers[i]
Next

Delete[] numbers

此代码分配一个包含 5 个整数的数组,为它们填充值,然后释放内存。请注意,对于数组,应使用 Delete[] 而不是常规的 Delete

带 UDT 析构函数的 Delete

Delete 会自动调用用户定义类型的析构函数。

delete_destructor.bas
Type Resource
    handle As Integer
    
    Declare Destructor()
End Type

Destructor Resource()
    Print "Releasing resource with handle"; handle
End Destructor

Dim res As Resource Ptr = New Resource
res->handle = 42

Delete res

当对 Resource 对象调用 Delete 时,在释放内存之前会自动调用其析构函数。这对于清理操作非常有用。

删除前检查 Null

在尝试删除之前检查指针是否为 null 是一个好习惯。

delete_null_check.bas
Dim ptr As Integer Ptr = 0

If ptr Then
    Delete ptr
Else
    Print "Pointer is null, no deletion needed"
End If

此示例演示了安全的删除方式,即先检查指针是否为 null。在 FreeBasic 中删除 null 指针是安全的,但显式检查可以使代码意图更清晰。

内存泄漏示例

这展示了当您忘记使用 Delete 时会发生什么。

delete_leak.bas
Sub AllocateMemory()
    Dim buffer As Byte Ptr = New Byte[1024]
    ' Forgot to Delete buffer
End Sub

AllocateMemory()
Print "Memory was allocated but not freed"

每次调用 AllocateMemory() 都会泄漏 1KB 的内存。在实际应用程序中,此类泄漏会累积并导致性能问题或崩溃。请始终将 NewDelete 配对使用。

带自定义内存管理的 Delete

Delete 可与自定义分配方案一起使用。

delete_custom.bas
Type MemoryBlock
    size As Integer
    data As Byte Ptr
    
    Declare Constructor(s As Integer)
    Declare Destructor()
End Type

Constructor MemoryBlock(s As Integer)
    size = s
    data = New Byte[size]
    Print "Allocated"; size; "bytes"
End Constructor

Destructor MemoryBlock()
    Delete[] data
    Print "Freed"; size; "bytes"
End Destructor

Dim block As MemoryBlock Ptr = New MemoryBlock(1024)
Delete block

此示例显示了一个管理自己内存的 MemoryBlock 类型。调用 Delete 时,析构函数会处理清理工作。这种模式对于资源管理类很有用。

二次删除保护

此示例说明了为什么不应该删除指针两次。

delete_double.bas
Dim value As Integer Ptr = New Integer
*value = 42

Delete value
' value = 0 ' Good practice: nullify after deletion

' Uncommenting this would cause undefined behavior:
' Delete value

二次删除指针会导致未定义行为和潜在的崩溃。删除后,应将指针置为 null 或避免再次使用它。某些系统可能似乎能处理二次删除,但这永远不安全。

最佳实践

本教程通过实际示例介绍了 FreeBasic Delete 关键字,展示了正确的内存释放技术。

作者

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

列出所有 FreeBasic 教程