REALLOCATE
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgReallocate
- 最后更新: 2024-06-19
REALLOCATE — 调整现有内存分配的大小
语法
vb
declare function Reallocate cdecl ( byval pointer as any ptr, byval count as uinteger ) as any ptr用法
vb
result = Reallocate( pointer, count )参数
| 参数 | 描述 |
|---|---|
pointer | 要调整大小的内存块地址(之前由 Allocate 或 Callocate 分配)。 |
count | 新的总字节大小。 |
返回值
- 成功时:返回调整大小后的内存块地址(可能与
pointer不同)。 - 失败时:返回空指针(
0);pointer处的原始内存块保持不变。
说明
Reallocate 调整之前由 Allocate 或 Callocate 分配的内存块的大小。
行为:
- 缓冲区的内容在新旧大小的最小值范围内保持不变。
- 如果
count小于原始大小,缓冲区将被截断。 - 如果
count更大,新增的内存区域不会被初始化。 - 重新分配首先尝试原地调整块大小(返回相同的指针)。如果不可能,则分配一个新块,复制现有数据,并释放旧块(返回不同的指针)。
关键规则:
- 始终保存返回值。 成功重新分配后,原始
pointer可能失效。丢弃返回值会导致内存泄漏。 - 检查返回值。 如果为
0,重新分配失败;原始pointer仍然有效,分配大小不变。 - 使用
Deallocate释放。 重新分配的块在不再需要时必须释放。 - 特殊情况:
- 如果
pointer为0,Reallocate行为完全类似于Allocate。 - 如果
pointer有效但count为0,Reallocate行为类似于Deallocate并返回0。
- 如果
- 未定义行为: 对已经被释放的指针调用
Reallocate会导致未定义行为。 - 字符串 / 含字符串的 UDT: 如果
count大于原始大小,在访问任何字符串成员之前,必须显式将新内存区域清零(例如使用Clear)。否则可能导致读写随机内存地址。 - 成员过程: 不要在成员过程内部使用
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 没有等效功能。
参见
- KeyPgAllocate —
Allocate - KeyPgCallocate —
Callocate - KeyPgDeallocate —
Deallocate