天马座 发表于 2020-11-7 23:24:06

【VB】基于数组的内存管理

本帖最后由 天马座 于 2020-11-7 23:31 编辑

众所周知VB没有指针对象,很多语言也没有指针对象,导致编写链式存储结构很麻烦,但是VB有数组,并且一般情况编写链式存储结构的数据类型的成员都是固定的完全可以使用数组实现,那么数组的索引就相当于内存地址,
比如一个树的节点可以写成如下形式
Dim mem() As TreeNode
debug.print mem(p).key '索引相当于地址 mem数组相当于整个内存
那么我们只需要对数组的规模和索引进行有效的管理就可以了
如果还是不明白可以参考 算法导论 第10章 10.3 指针和对象实现
下面是我封装好的一个类,大家可以直接拿去使用,类外绑定一下数据类型就可以
手机打字有点费劲 例子就不写了,自行脑补
Private Const START_HEADER = 0
Private header As Long, allocCount As Long, last As Long
Private nextFree() As Long
Private Sub Class_Initialize()
    Call clear
End Sub
Private Sub Class_Terminate()
    Erase nextFree
End Sub
Public Property Get count() As Long
    count = allocCount
End Property
Public Property Get capacity() As Long
    capacity = last - START_HEADER
End Property
Public Sub clear()
    allocCount = 0
    header = START_HEADER
    last = START_HEADER + 1
    ReDim nextFree(START_HEADER To last - 1)
    nextFree(header) = last
End Sub
Public Function alloc() As Long
    '分配一个自由的索引
    If header = last Then
      Call doubleCapacity
    End If
    Dim result As Long
    result = header
    header = nextFree(header)
    nextFree(result) = START_HEADER - 1
    allocCount = allocCount + 1
    alloc = result
End Function
Public Function free(ByVal p As Long) As Boolean
    '把索引标记成自由
    If p < START_HEADER Or p >= last Then
      free = False
      Exit Function
    End If
    If nextFree(p) >= START_HEADER Then
      free = False
      Exit Function
    End If
    nextFree(p) = header
    header = p
    allocCount = allocCount - 1
    free = True
End Function
Private Sub doubleCapacity()
    last = START_HEADER + (last - START_HEADER) * 2
    ReDim Preserve nextFree(START_HEADER To last - 1)
    Dim i As Long
    For i = header To last - 1
      nextFree(i) = i + 1
    Next
End Sub

0xAA55 发表于 2020-11-7 23:52:51

VB没有“指针对象”,C语言和C++也没有。

但,VB有对象,有类,使用对象和类可以实现链式结构,并不麻烦。并且还自带引用计数,就像C++的智能指针shared_ptr一样。

参考我使用VB6实现AVL二分查找树:
https://www.0xaa55.com/thread-25770-1-1.html

天马座 发表于 2020-11-8 00:02:00

0xAA55 发表于 2020-11-7 23:52
VB没有“指针对象”,C语言和C++也没有。

但,VB有对象,有类,使用对象和类可以实现链式结构,并不麻烦。 ...

用类编写代码有点丑 判空和赋值 有点啰嗦
比如查找最小节点,数组版代码如下,更加接近c风格
Private Function getFirstEntry() As Long
    Dim p As Long
    p = root
    If p <> NULL_PTR Then
      Do While leftChild(p) <> NULL_PTR
            p = leftChild(p)
      Loop
    End If
    getFirstEntry = p
End Function
页: [1]
查看完整版本: 【VB】基于数组的内存管理