Allocate
 
从空闲存储器赋值一块内存

语法

Declare Function Allocate cdecl ( ByVal count As Integer ) As Any Ptr

用法

result = Allocate( count )

参数

count
要赋值的内存块的大小(以字节为单位)。

返回值

如果成功,则返回赋值内存的开始地址。否则,如果请求的块大小无法赋值,或者如果count < 0,则返回空指针(0)。

说明

尝试从空闲存储器(堆)中赋值或保留count 个字节数。新赋值的内存未初始化。

由于新赋值的内存的初始值未指定,Allocate不能与包含字符串的StringUdt直接一起使用,因为字符串描述符不会被清除(包含随机数据),可能会导致损坏的字符串或更多(尝试写入内存中的随机位置或尝试取消赋值随机指针)。在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


平台差异

  • 此过程不能保证线程安全。

方言差异

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

与QB差别

  • 新的FreeBASIC

参考