MST

星途 面试题库

面试题:Fortran动态内存管理中的指针重分配与释放

在一个Fortran程序中,已经通过ALLOCATE为一个指针分配了内存,现在需要根据新的条件重新分配不同大小的内存。请编写代码实现这个过程,并确保内存释放得当,避免内存泄漏。同时说明在重新分配内存前为什么需要检查指针是否已经分配内存以及如何检查。
35.9万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试

以下是实现代码:

program reallocate_memory
    implicit none
    integer, pointer :: my_ptr(:)
    integer :: new_size, i

   ! 初始分配内存
    new_size = 5
    allocate(my_ptr(new_size))
    do i = 1, new_size
        my_ptr(i) = i
    end do

   ! 新的条件,新的大小
    new_size = 10

   ! 重新分配内存前检查指针是否已分配内存
    if (associated(my_ptr)) then
       ! 释放旧内存
        deallocate(my_ptr)
    end if

   ! 重新分配内存
    allocate(my_ptr(new_size))
    do i = 1, new_size
        my_ptr(i) = i
    end do

   ! 输出结果验证
    do i = 1, new_size
        print *, my_ptr(i)
    end do

   ! 程序结束前释放内存
    if (associated(my_ptr)) then
        deallocate(my_ptr)
    end if
end program reallocate_memory

检查指针是否已经分配内存的原因:

如果不检查指针是否已经分配内存就直接尝试释放它,会导致程序运行时错误,因为释放一个未分配的指针是未定义行为。在 Fortran 中,deallocate 一个未分配的指针会引发错误,可能导致程序崩溃。

如何检查:

在 Fortran 中,可以使用 associated 函数来检查指针是否已经分配内存。associated(pointer_variable) 函数会返回一个逻辑值,如果指针已经分配内存(即与某个内存对象相关联)则返回 .true.,否则返回 .false.。在上面的代码中,if (associated(my_ptr)) 语句就是用来检查 my_ptr 指针是否已经分配内存,以便安全地进行内存释放操作。