Reallocate
 
为现有的预留内存块重新赋值存储空间

语法

Declare Function Reallocate cdecl ( ByVal pointer As Any Ptr, ByVal count As Integer ) As Any Ptr

用法

result = Reallocate( pointer , count )

参数

pointer
要重新赋值的赋值内存的地址。
count
总共要重新赋值的字节数。

返回值

重赋值内存的地址。如果重新赋值不成功,则返回null(0)指针,并且pointer 指向的原始内存保持不变。

说明

尝试重新赋值或调整大小先前使用AllocateCAllocate赋值的内存。缓冲区的内容被保留,尽管如果count 小于内存块的原始大小,缓冲区将被截断。如果大小增加,则添加的内存范围不会被初始化为任何内容。

当使用Reallocate时,必须保存result 指针以防止潜在的内存泄漏,因为原始pointer 在重新赋值后可能不再有效。应该检查新指针的值 - 如果是0,则重新赋值失败 - 原始pointer 保持有效,并且赋值给它的内存量没有改变。

当不再需要时,必须使用Deallocate释放重新赋值的内存。

如果pointer 为null(0),则ReAllocate的行为与Allocate的行为相同。如果pointer 有效且count 为空(0),则ReAllocate的行为与Deallocate类似,并返回null(0)指针。

如果以前通过调用DeallocateReAllocate释放了内存,则行为是未定义的。

当为String描述符(或Udt包含一个)描述符手动赋值内存时,如果count 大于内存块的原始大小,则新的额外内存范围必须在第一个字符串之前明确清除为零使用(例如,使用Clear)。否则访问该字符串将导致未定义的结果(尝试在内存中的随机位置进行写入或读取,或尝试释放随机指针)。

此函数不是FreeBASIC运行时库的一部分,它是C运行时库realloc 的别名,因此不能保证在所有平台中都是线程安全的。

注意事项:在对象函数内部重新赋值一个指针,当该指针包含该函数的父对象时,它是未定义的,并且可能导致可怕的崩溃。

例子

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

a = Allocate( 5 * SizeOf(Integer) )   '赋值内存5个整数

If a = 0 Then Print "错误赋值a": End

For i = 0 To 4
  a[i] = (i + 1) * 2   '将整数赋值给缓冲区
Next i

b = Reallocate( a, 10 * SizeOf(Integer) )   '重新赋值内存5个额外的整数

If b <> 0 Then

    a = b   '丢弃旧的指针并使用新的指针

    For i = 5 To 9
      a[i] = (i + 1) * 2   '为缓冲区赋值更多的整数
    Next i

    For i = 0 To 9   '打印整数
      Print i, a[i]
    Next i
    Print

Else ''重新赋值失败,内存不变

    Print "重新赋值错误"

    For i = 0 To 4   '打印整数
      Print i, a[i]
    Next i
    Print

End If

Deallocate a   '清理


方言差异

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

与QB差别

  • 新的FreeBASIC

参考