从空闲存储器赋值一块内存
语法
用法
result = Allocate( count )
参数
count
要赋值的内存块的大小(以字节为单位)。
返回值
如果成功,则返回赋值内存的开始地址。否则,如果请求的块大小无法赋值,或者如果count < 0,则返回空指针(0)。
说明
尝试从空闲存储器(堆)中赋值或保留
count 个字节数。新赋值的内存未初始化。
由于新赋值的内存的初始值未指定,
Allocate不能与包含字符串的
String或
Udt直接一起使用,因为字符串描述符不会被清除(包含随机数据),可能会导致损坏的字符串或更多(尝试写入内存中的随机位置或尝试取消赋值随机指针)。在
UDT的情况下,在
Allocate之后,最好使用
CAllocate(清除内存)或
New(调用构造函数),以明确地清除描述符(设置为0)在第一个字符串使用之前。
返回的指针是
任何PTR,并指向已赋值内存的开始。这个指针保证是唯一的,即使
count 为零。
在不再需要时,赋值的内存必须由
Deallocate解除赋值或返回到空闲存储器。
例子
''该程序使用ALLOCATE(...)函数来创建一个15个整数的缓冲区
''然后填写前15个斐波纳契序列号,然后输出到
''屏幕。注意在程序结束时对DEALLOCATE(...)的调用。
Const integerCount As Integer = 15
''尝试为多个整数赋值内存。
''
Dim buffer As Integer Ptr
buffer = Allocate(integerCount * SizeOf(Integer))
If (0 = buffer) Then
Print "错误:无法赋值内存,退出。"
End -1
End If
''用斐波那契序列填充和填充记忆。
''
buffer[0] = 0
buffer[1] = 1
For i As Integer = 2 To integerCount - 1
buffer[i] = buffer[i - 1] + buffer[i - 2]
Next
''显示顺序。
''
For i As Integer = 0 To integerCount - 1
Print buffer[i] ;
Next
Deallocate(buffer)
End 0
输出为:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 |
释放赋值的内存是非常重要的,因为它不再被使用了。未被释放的未使用的内存只是浪费内存,如果该内存的地址以某种方式被覆盖或被遗忘,则该内存永远不会被释放。这种情况被称为内存泄漏,应该不惜一切代价避免。注意,当应用程序终止时,泄漏的内存总是完全释放,无论是通过“普通”退出还是崩溃,所以只要应用程序运行,泄漏“持续”,但是,释放应用程序中赋值的内存是一个好习惯。以下示例演示了具有内存泄漏的函数,其中赋值的内存的地址丢失,并且不再被释放。如果频繁调用这样的功能,浪费的内存总量可以快速增加。
''赋值使用的错误示例,导致内存泄漏
Sub BadAllocateExample()
Dim p As Byte Ptr
p = Allocate(420) ''将指针指向新内存
p = Allocate(420) ''重新赋值相同的指针到不同的内存,
''旧地址丢失,内存泄漏
Deallocate(p)
End Sub
''主要
BadAllocateExample() ''创建内存泄漏
Print "内存泄漏!"
BadAllocateExample() ''...和另一个
Print "内存泄漏!"
End
平台差异
方言差异
与QB差别
参考