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
Fortran中的自由错误/堆损坏取决于超出范围的索引_Fortran_Free_Gfortran_Heap Corruption_Intel Fortran - Fatal编程技术网

Fortran中的自由错误/堆损坏取决于超出范围的索引

Fortran中的自由错误/堆损坏取决于超出范围的索引,fortran,free,gfortran,heap-corruption,intel-fortran,Fortran,Free,Gfortran,Heap Corruption,Intel Fortran,我有一个复杂的模型-要在这里发布-我正试图调试一些奇怪的行为。在释放内存时,我偶尔会在模型运行结束时收到空闲/堆损坏错误。我可以在Windows visual fortran和linux gfortran中重现这种行为 我创建了一个简单的测试程序,它再现了我在应用程序中看到的一些非常奇怪的行为 任何时候超过数组的界限-我感到羞耻-都是程序员的错,但是这种行为让人很难理解!根据超出的索引(2D数组的第一个或第二个),程序将在解除分配时引发堆损坏错误,或者在使用优化编译时无错误地继续 根据是否调用第

我有一个复杂的模型-要在这里发布-我正试图调试一些奇怪的行为。在释放内存时,我偶尔会在模型运行结束时收到空闲/堆损坏错误。我可以在Windows visual fortran和linux gfortran中重现这种行为

我创建了一个简单的测试程序,它再现了我在应用程序中看到的一些非常奇怪的行为

任何时候超过数组的界限-我感到羞耻-都是程序员的错,但是这种行为让人很难理解!根据超出的索引(2D数组的第一个或第二个),程序将在解除分配时引发堆损坏错误,或者在使用优化编译时无错误地继续

根据是否调用第23/24行,行为完全不同


显然,要做的事情是使用checkall进行编译,并跟踪到发生错误的行,但这似乎仍然是一种不好的行为。我真的很好奇,是否有人能至少解释一下这里发生了什么

如果将数组索引超出范围,则可能发生任何情况。根据标准,这是一种未定义的行为。这就是为什么您提到了
检查
选项-指定至少对特定实现会发生什么。但是程序运行得比较慢


实际发生的情况是,您可能(没有显示实际的错误消息!)重写内存分配器(malloc)的内部簿记数据结构,然后在分配器尝试使用损坏的信息时引发错误。

如果索引数组超出范围,则可能会发生任何情况。根据标准,这是一种未定义的行为。这就是为什么您提到了
检查
选项-指定至少对特定实现会发生什么。但是程序运行得比较慢


实际发生的情况是,您可能(没有显示实际的错误消息!)重写内存分配器(malloc)的内部簿记数据结构,然后当分配器尝试使用损坏的信息时,会引发错误。

也发布在英特尔论坛上:我投了否决票,因为我不明白问题的重点。事实上,我很难看到一个问题;只是需要讨论/猜测。问题是已知的:对声明边界之外的数组进行索引。修好它。有充分的证据表明,它会导致行为在不同的跑步中发生变化,这取决于许多因素。我没有问清楚这个问题(到底是什么?)。让我们再试一次。我有一个realy程序,它包含数百个数组,这些数组根据用户输入进行分配和索引。我正在努力添加验证代码,但与此同时,如果有一种方法可以确定在解除分配失败时哪个变量导致了问题,这将是一个很大的帮助。windows异常通常是无用的,我正在与minidump作斗争。建议?在英特尔论坛的帖子中也可以看到其他的评论……也在英特尔论坛上发布:我投了反对票,因为我不明白问题的重点。事实上,我很难看到一个问题;只是需要讨论/猜测。问题是已知的:对声明边界之外的数组进行索引。修好它。有充分的证据表明,它会导致行为在不同的跑步中发生变化,这取决于许多因素。我没有问清楚这个问题(到底是什么?)。让我们再试一次。我有一个realy程序,它包含数百个数组,这些数组根据用户输入进行分配和索引。我正在努力添加验证代码,但与此同时,如果有一种方法可以确定在解除分配失败时哪个变量导致了问题,这将是一个很大的帮助。windows异常通常是无用的,我正在与minidump作斗争。建议?在英特尔论坛帖子中也可以看到其他评论…我在错误中得到的只是测试代码下面的评论中发布的内容一个用于windows/ifort,一个用于linux/gfortran。在一个更复杂的应用程序中,有没有什么方法可以判断是什么数组导致了错误(比如从一个小型转储文件中)?您最好的选择是避免非法使用下标。在您确信您的程序没有之前,最好进行运行时下标检查。我的经验是,对于大多数程序来说,运行时CPU成本很低。也有例外情况,运行时间大幅增加。非法订阅可能会损坏内部簿记或覆盖其他变量。可能的后果是多方面的,很难找到根本原因。同意-我没有创建这个程序,我正在尝试修复其他人编写的旧应用程序中的问题。输入文件用于分配和索引到数组中。我正在努力添加验证代码,但如果我能够找出在释放期间导致最终异常的数组,即使我无法在没有边界检查的情况下获得堆栈跟踪到实际原因,这将非常有帮助。这个应用程序可以运行超过100个小时时,优化和双倍的边界检查!可怜我吧,别再投票否决我的问题了。非法订阅是一个错误,即使程序在解除分配过程中没有引起错误,也应该纠正。下标错误会导致程序给出难以注意的错误答案。完全同意。我可以看出您认为我建议只修复导致堆错误的那些错误!我特别感兴趣的是何时/为什么会导致错误,因为我想找到所有错误,而不仅仅是导致错误的错误。很难注意到,在程序中,变量是由用户派生的输入索引的,这是一种轻描淡写的说法。正如我上面所说,我正在努力添加验证…我在错误中得到的只是发布在comme中的内容