Sun Studio 12:Fortran 库参考

1.4.35 mallocmalloc64reallocfree:分配/重新分配/解除分配内存

函数 malloc()malloc64()realloc() 分配内存块并返回块的起始地址。返回值可以用于设置 INTEGER 或 Cray 样式的 POINTER 变量。realloc() 根据新的大小重新分配现有内存块。free() 解除分配由 malloc()malloc64()realloc() 分配的内存块。


注 –

这些例程在 f95 中以内函数实现,而在 f77 中是外部函数。它们不应该出现在 Fortran 95 程序的类型声明和 EXTERNAL 语句中,除非您要使用自己的版本。只有 f95 中实现 realloc() 例程。


符合标准的 Fortran 95 程序应该将 ALLOCATEDEALLOCATE 语句用于 ALLOCATABLE 数组,以便执行动态内存管理,且不能直接调用 malloc/realloc/free

传统的 Fortran 77 程序可以使用 malloc()/malloc64() 为 Cray 样式的 POINTER 变量赋值,这些变量的数据表示形式与 INTEGER 变量的数据表示形式相同。在 f95 中实现了 Cray 样式的 POINTER 变量,以便能够从 Fortran 77 进行移植。

1.4.35.1 malloc malloc64:分配内存

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 指向该内存),并将其初始化为零。

1.4.35.2 realloc:重新分配内存

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() 例程。

1.4.35.3 free:解除分配由 Malloc 分配的内存

该子例程的调用方式如下所示:

call free ( ptr )

ptr

Cray POINTER

输入 

free 解除分配先前由 mallocrealloc() 分配的内存区域。此时,该内存区域返回给内存管理器,用户程序不能再使用它。

示例:free()


       real x
       pointer ( ptr, x )
       ptr = malloc ( 10000 )
       call free ( ptr )
       end