函数 malloc()、malloc64() 和 realloc() 分配内存块并返回块的起始地址。返回值可以用于设置 INTEGER 或 Cray 样式的 POINTER 变量。realloc() 根据新的大小重新分配现有内存块。free() 解除分配由 malloc()、malloc64() 或 realloc() 分配的内存块。
这些例程在 f95 中以内函数实现,而在 f77 中是外部函数。它们不应该出现在 Fortran 95 程序的类型声明和 EXTERNAL 语句中,除非您要使用自己的版本。只有 f95 中实现 realloc() 例程。
符合标准的 Fortran 95 程序应该将 ALLOCATE 和 DEALLOCATE 语句用于 ALLOCATABLE 数组,以便执行动态内存管理,且不能直接调用 malloc/realloc/free。
传统的 Fortran 77 程序可以使用 malloc()/malloc64() 为 Cray 样式的 POINTER 变量赋值,这些变量的数据表示形式与 INTEGER 变量的数据表示形式相同。在 f95 中实现了 Cray 样式的 POINTER 变量,以便能够从 Fortran 77 进行移植。
malloc() 函数的调用方式如下所示:
k = malloc( n ) |
|||
n |
INTEGER |
输入 |
内存的字节数 |
返回值 |
INTEGER(Cray POINTER) |
输出 |
k>0:k 为分配的内存块起始位置的地址 k=0:错误 |
如果使用 -m64 针对 64 位环境进行了编译,则返回 INTEGER*8 指针值。参见下面的说明。 |
该函数在 Fortran 95 中属于内函数,而在 Fortran 77 中属于外部函数。对于编译为要在 64 位环境中运行的 Fortran 77 程序,应将 malloc() 函数和接收其输出的变量声明为 INTEGER*8。有一个函数 malloc64(3F),它用于实现在 32 位环境与 64 位环境之间移植程序。
k = malloc64( n ) |
|||
n |
INTEGER*8 |
输入 |
内存的字节数 |
返回值 |
INTEGER*8 (Cray POINTER) |
输出 |
k>0:k 是分配的内存块起始位置的地址 k=0:错误 |
这些函数会分配一片内存区域,并返回该区域起始位置的地址。(在 64 位环境中,返回的字节地址可能超出 INTEGER*4 数值范围-必须将接收变量声明为 INTEGER*8 以免内存地址被截断。)内存区域并未以任何方式初始化,因此,不应假设它已预设为什么内容,尤其是零!
示例:使用 malloc() 的代码片段:
parameter (NX=1000) integer ( p2X, X ) real*4 X(1) … p2X = malloc( NX*4 ) if ( p2X .eq. 0 ) stop ’malloc: cannot allocate’ do 11 i=1,NX 11 X(i) = 0. … end |
在上面的示例中,获取了 4,000 字节的内存(p2X 指向该内存),并将其初始化为零。
f95 内函数 realloc() 的调用方式如下所示:
k = realloc(ptr, n ) |
|||
ptr |
INTEGER |
输入 |
现有内存块的指针。(上次调用 malloc() 或 realloc() 时返回的值)。 |
n |
INTEGER |
输入 |
请求的新内存块大小(以字节数表示)。 |
返回值 |
INTEGER (Cray POINTER) |
输出 |
k>0:k 是分配的新内存块起始位置的地址 k=0:错误 |
如果使用 -m64 针对 64 位环境进行了编译,则返回 INTEGER*8 指针值。参见下面的说明。 |
realloc() 函数将 ptr 指向的内存块的大小更改为 n 字节,并返回指向(可能已移动的)新内存块的指针。内存块的内容保存不变,其大小为新内存块大小和旧内存块大小中较小者。
如果 ptr 为零,则 realloc() 的行为与 malloc() 的行为相同,其分配大小为 n 字节的新内存块。
如果 n 为零而 ptr 不为零,则指向的内存块可以进一步进行分配,且仅在终止应用程序后才返回给系统。
示例:使用 malloc() 和 realloc() 以及 Cray 样式的 POINTER 变量:
PARAMETER (nsize=100001) POINTER (p2space,space) REAL*4 space(1) p2space = malloc(4*nsize) if(p2space .eq. 0) STOP ’malloc: cannot allocate space’ ... p2space = realloc(p2space, 9*4*nsize) if(p2space .eq. 0) STOP ’realloc: cannot reallocate space’ ... CALL free(p2space) ... |
请注意,只有 f95 中实现 realloc() 例程。
该子例程的调用方式如下所示:
call free ( ptr ) |
||
ptr |
Cray POINTER |
输入 |
free 解除分配先前由 malloc 和 realloc() 分配的内存区域。此时,该内存区域返回给内存管理器,用户程序不能再使用它。
示例:free():
real x pointer ( ptr, x ) ptr = malloc ( 10000 ) call free ( ptr ) end |