1

当指针关联时,我在解除分配时收到双重释放错误。我怀疑一些未定义的行为正在进行,但我不知道从哪里开始寻找它,或者如何。你如何追踪未定义的行为?

编译器是intel 12。我无法发布代码,因为它很大,我什至不确定问题的根源在于我的代码。它可能在同事的图书馆里。我试图用 gdb 做一些调试,但我没有走得太远。这是错误。

malloc:* 对象 0x102302f20 的错误:未分配被释放的指针 *在 malloc_error_break 中设置断点以进行调试

紧接其前的行是 print *, associated(pointer),它打印为 true。

这是回溯

#0  0x00007fff9327b6c0 in malloc_error_break ()
#1  0x00007fff9327b805 in free ()
#2  0x0000000100d27470 in for_dealloc_allocatable ()
#3  0x0000000100506699 in sharedarraysmodule_mp_deleterealsharedarray2_ () at SharedArrays.f90:609
#4  0x00000001003bbc4e in gammaaggregatormodule_mp_deleteprivate_ () at GammaAggregator.f90:86
#5  0x0000000102300bc0 in ?? ()
Previous frame inner to this frame (gdb could not unwind past this frame)
4

1 回答 1

4

长评论,可能会指向(对不起,无法抗拒)答案......

为了迂腐,看起来您的编译器的最佳猜测是“未分配指针被释放”。但是在 Fortran 指针中只有 statuses undefinedassociated因此disassociated错误消息可能来自对编译器链接到可执行文件的系统函数的调用。

话虽如此,我会寻找:

  • 目标超出范围,而指向它的指针仍在范围内。Fortran 2003 标准状态(注释 16.13)

    来自模块程序单元的指针可以通过使用关联在子程序中访问。此类指针的生命周期大于子程序中声明的目标,除非保存此类目标。因此,如果这样的指针与本地目标相关联,则有可能当子程序定义的过程完成执行时,目标将不复存在,从而使指针“悬空”。本标准认为此类指针具有未定义的关联状态。它们既没有关联也没有分离。在重新建立其状态之前,不得在计划中再次使用它们。不要求处理器能够检测指针目标何时停止存在。

同一份文档还指出,传递给associated内在函数的指针的关联状态不应是未定义的,因此程序可能会撒谎并告诉您associated(undefined_pointer)==.true..

  • 通过超出范围或作为deallocate()调用的结果,正在释放的可分配目标。
  • 指针在声明时被取消,例如real, pointer :: rptr => null()(这通常被认为是一件好事,您可能希望确保您的代码符合)。
  • 指针在关联之前被无效,尽管根据标准我不认为使空指针无效是错误的。
  • 指向指针的指针。

您报告的错误消息往往表明您遇到模块变量超出范围的情况,但是,正如您已经观察到的那样,很难确定。

如果这没有帮助,请联系英特尔技术支持,我发现他们非常有帮助,他们非常擅长发现代码中的问题。

于 2012-07-06T14:59:24.923 回答