Skip to content

REALLOCATE


REALLOCATE — 调整现有内存分配的大小

语法

vb
declare function Reallocate cdecl ( byval pointer as any ptr, byval count as uinteger ) as any ptr

用法

vb
result = Reallocate( pointer, count )

参数

参数描述
pointer要调整大小的内存块地址(之前由 AllocateCallocate 分配)。
count新的总字节大小。

返回值

  • 成功时:返回调整大小后的内存块地址(可能与 pointer 不同)。
  • 失败时:返回空指针(0);pointer 处的原始内存块保持不变。

说明

Reallocate 调整之前由 AllocateCallocate 分配的内存块的大小。

行为:

  • 缓冲区的内容在新旧大小的最小值范围内保持不变。
  • 如果 count 小于原始大小,缓冲区将被截断。
  • 如果 count 更大,新增的内存区域不会被初始化。
  • 重新分配首先尝试原地调整块大小(返回相同的指针)。如果不可能,则分配一个新块,复制现有数据,并释放旧块(返回不同的指针)。

关键规则:

  1. 始终保存返回值。 成功重新分配后,原始 pointer 可能失效。丢弃返回值会导致内存泄漏。
  2. 检查返回值。 如果为 0,重新分配失败;原始 pointer 仍然有效,分配大小不变。
  3. 使用 Deallocate 释放。 重新分配的块在不再需要时必须释放。
  4. 特殊情况:
    • 如果 pointer0Reallocate 行为完全类似于 Allocate
    • 如果 pointer 有效但 count0Reallocate 行为类似于 Deallocate 并返回 0
  5. 未定义行为: 对已经被释放的指针调用 Reallocate 会导致未定义行为。
  6. 字符串 / 含字符串的 UDT: 如果 count 大于原始大小,在访问任何字符串成员之前,必须显式将新内存区域清零(例如使用 Clear)。否则可能导致读写随机内存地址。
  7. 成员过程: 不要在成员过程内部使用 Reallocate 来调整对象实例本身(This)的大小。如果内存被移动,This 引用将变得不一致。

示例

vb
Dim a As Integer Ptr, b As Integer Ptr, i As Integer

' Allocate space for 5 integers
a = Allocate(5 * SizeOf(Integer))
If a = 0 Then Print "Error allocating a": End

' Assign values
For i = 0 To 4
    a[i] = (i + 1) * 2
Next i

' Resize to hold 10 integers
b = Reallocate(a, 10 * SizeOf(Integer))

If b <> 0 Then
    a = b  ' Use the new pointer; old pointer is now invalid
    For i = 5 To 9
        a[i] = (i + 1) * 2
    Next i
    For i = 0 To 9
        Print i, a[i]
    Next i
Else
    Print "Reallocation failed"
    For i = 0 To 4
        Print i, a[i]
    Next i
End If

Deallocate a

方言差异

  • -lang qb 方言中不可用,除非通过别名 __Reallocate 引用。

与QB的区别

  • 这是 FreeBASIC 的扩展;QB 没有等效功能。

参见

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系