Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management FORTRAN中的释放和内存分配问题_Memory Management_Fortran_Glibc_Double Free - Fatal编程技术网

Memory management FORTRAN中的释放和内存分配问题

Memory management FORTRAN中的释放和内存分配问题,memory-management,fortran,glibc,double-free,Memory Management,Fortran,Glibc,Double Free,我在FORTRAN代码中的部分解除分配和分配方面遇到了问题。特别是,我认为这个问题与在web上搜索我的错误消息时的内存分配有关。错误消息涉及无效指针,但是,我没有在程序中使用任何指针 在完成我的f循环(见下文)的迭代#2之后,程序崩溃,或者更确切地说,大部分时间它崩溃,有时它只是冻结。我相信这就是问题所在。当程序运行到这一点时 我没有显示子例程,但由于它们适用于其他模拟组合,我有理由相信它们不是问题所在。我在程序的其他地方使用了deallocate和allocate(成功),所以我很惊讶它在这里

我在FORTRAN代码中的部分解除分配和分配方面遇到了问题。特别是,我认为这个问题与在web上搜索我的错误消息时的内存分配有关。错误消息涉及无效指针,但是,我没有在程序中使用任何指针

在完成我的f循环(见下文)的迭代#2之后,程序崩溃,或者更确切地说,大部分时间它崩溃,有时它只是冻结。我相信这就是问题所在。当程序运行到这一点时

我没有显示子例程,但由于它们适用于其他模拟组合,我有理由相信它们不是问题所在。我在程序的其他地方使用了deallocate和allocate(成功),所以我很惊讶它在这里不起作用

为了便于阅读,我只展示了部分节目。特别是,我删除了对我编写的子程序的调用。我希望我已经为你们程序员提供了足够的信息来帮助我解决这个问题。如果没有,请指定您需要的其他信息,我将很乐意遵守。我已经使用各种编译器选项编译了这个程序,修复了一些bug并删除了所有警告。然而,在这一点上,编译器选项并没有给我更多的信息

allocate(poffvect(1:6))
allocate(phi1out(1:1))
allocate(phi2out(1:1))
allocate(phi1outs1(1:1))
allocate(phi2outs1(1:1))

     dummy allocation
   allocate(phi1outind(1:1))
   allocate(phi2outind(1:1))
   allocate(phi1outinds1(1:1))
   allocate(phi2outinds1(1:1))

   do e = 1, 6
     print *,"e", e
     do f = 1, 3

       print *,"f", f, iteratst1(f), trim(filenumcharimp)

       deallocate(phi1outinds1, STAT = AllocateStatus)
     if (AllocateStatus /= 0) stop "Error during  deallocation of phi1outinds1"
     print *, "Allocatestatus of phi1outinds1 is",  AllocateStatus
     deallocate(phi2outinds1, STAT = AllocateStatus)
    print *, "DeAllocatestatus of phi1outinds2 is", AllocateStatus

     if (AllocateStatus /= 0) stop "Error during deallocation of phi2outinds1"
    print *, "we deallocate f loop ok", iteratst1(f)

      allocate(phi1outinds1(1:iteratst1(f)), STAT = AllocateStatus)
     if (AllocateStatus /= 0) stop "Error during allocation of phi1outinds1"
     allocate(phi2outinds1(1:iteratst1(f)), STAT = AllocateStatus)
    if (AllocateStatus /= 0) stop "Error during deallocation of phi1outinds1"

 end do
 end do
编译器选项

ifort -free -check  -traceback -o adatptmultistage1new.out adatptmultistage1new.f90
输出

       e           1
       f           1        5000 43
     DeAllocatestatus of phi1outinds1 is           0
    DeAllocatestatus of phi1outinds2 is           0
    we deallocate f loop ok        5000
   f loop done           1
  f           2       10000 43
 Allocatestatus of phi1outinds1 is           0
 DeAllocatestatus of phi1outinds2 is           0
 we deallocate f loop ok       10000
   f loop done           2
   f           3       15000 43
  Allocatestatus of phi1outinds1 is           0
错误消息

*** glibc detected *** ./adatptmultistage1new.out: munmap_chunk(): invalid pointer:   0x0000000000d3ddd0 ***
    ======= Backtrace: =========
    /lib/libc.so.6(+0x77806)[0x7f5863b7b806]
   .    /adatptmultistage1new.out[0x43247c]
   .    /adatptmultistage1new.out[0x404368] 
   ./adatptmultistage1new.out[0x4031ec]
   /lib/libc.so.6(__libc_start_main+0xfd)[0x7f5863b22c4d]
  .    /adatptmultistage1new.out[0x4030e9]
   ======= Memory map: ========
00400000-004d4000 r-xp 00000000 08:03    9642201 
/home/jgold/smwcv/error_infect/test/surfaces/multistage/adaptonly/adatptmultistage1new.out
006d4000-006dc000 rw-p 000d4000 08:03 9642201
[为简洁起见,未显示错误消息的其余部分]

  7fffb004d000-7fffb00bc000 rw-p 00000000 00:00 0                          [stack]
  7fffb01d7000-7fffb01d8000 r-xp 00000000 00:00 0                          [vdso]
  ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
  Aborted

这是很多代码,我们要努力弄清楚。您是否使用尽可能多的编译器调试选项编译了它?特别是,是否使用数组边界检查?你在用什么编译器?我没有看到“使用”语句。。。最好将您的子例程放入一个模块并“使用”该模块,以便编译器可以检查实际参数和伪参数之间的参数一致性

编辑:“双重释放或损坏”表示内存已损坏。由于您似乎没有任何指针,因此有三种可能的方式损坏内存:

  • 使用尚未分配的可分配变量。如果allocate语句失败,程序可能会在该点抛出错误。您可能正在使用一个忘记分配的变量
  • 过程调用中的参数与过程期望的参数之间存在分歧,即实际参数和伪参数之间存在分歧。使用模块将允许编译器对此进行更好的检查
  • 通过使用非法下标值在数组大小之外写入—这将覆盖“随机”内存,例如描述下一个数组的内部结构。启用运行时下标或数组绑定检查将对此进行测试。使用ifort时使用:
    -检查边界
    -检查所有
    。对于非常彻底的检查,请尝试:
    -O2-支架f03-全部检查-回溯-全部警告-fstack protector-假设保护\u parens-隐式

  • 你能修正你的源代码格式吗。缩进也有帮助。您不检查任何分配或取消分配语句返回的状态代码。这样做可能会提供一些有用的诊断信息。即使在编辑之后,这仍然是大量代码需要处理。请修改您的问题,以清楚地说明您对调试所做的工作,并尝试将代码示例精简到仅与之相关的部分。如果你能做到这一点,请标记你的问题供版主审阅。嗨,我会尝试你的建议。我对代码的数量表示歉意。我正在使用一个代码,然后修改它以增加复杂性。我正在使用ifort。你所说的数组边界检查是什么意思,所以我已经做了,虽然它通过通知我程序中不再使用的变量来帮助我。从它提供的信息中,我看不到任何明显的东西。我通过应用这些选项发布消息,以便您可以看到它,并希望比我更好地解释它。我真的很感谢你的帮助。谢谢。看来你现在链接有问题了。是否有任何早期错误或警告消息?不确定链接的含义。。很抱歉在完全检查模式下,我得到警告,系统并不完全不满意我在open命令中有几行很长的文件名。问题总是发生在我的f循环的第三次迭代之后。因此,在它变得不稳定之前,它会输出几个文件,大约512个不同的结果文件。我应该补充一点,status命令不会停止程序,这表明它具有ok状态,但程序不会在解除分配后打印输出。i、 e.程序在该位置卡住。感谢链接:我指的是所有关于“X的多重定义”的错误信息。是否为操作系统打开的文件太多?处理完文件后是否关闭它们?编译后是否使用“-check all”或“-check bounds”运行程序?