为现有的预留内存块重新赋值存储空间
语法
用法
result = Reallocate( pointer , count )
参数
pointer
要重新赋值的赋值内存的地址。
count
总共要重新赋值的字节数。
返回值
重赋值内存的地址。如果重新赋值不成功,则返回null(0)指针,并且pointer 指向的原始内存保持不变。
说明
尝试重新赋值或调整大小先前使用
Allocate或
CAllocate赋值的内存。缓冲区的内容被保留,尽管如果
count 小于内存块的原始大小,缓冲区将被截断。如果大小增加,则添加的内存范围不会被初始化为任何内容。
当使用
Reallocate时,必须保存
result 指针以防止潜在的内存泄漏,因为原始
pointer 在重新赋值后可能不再有效。应该检查新指针的值 - 如果是
0,则重新赋值失败 - 原始
pointer 保持有效,并且赋值给它的内存量没有改变。
当不再需要时,必须使用
Deallocate释放重新赋值的内存。
如果
pointer 为null(
0),则
ReAllocate的行为与
Allocate的行为相同。如果
pointer 有效且
count 为空(0),则
ReAllocate的行为与
Deallocate类似,并返回null(0)指针。
如果以前通过调用
Deallocate或
ReAllocate释放了内存,则行为是未定义的。
当为
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 '清理
方言差异
与QB差别
参考