Delphi动态数组SetLength崩溃

时间:2018-08-20 17:25:43

标签: delphi delphi-10.1-berlin

我正在使用Delphi 10.1和Windows 10,以及所有当前更新。

我的应用程序使用并重复使用大量动态数组(50个或更多),每个数组最多包含5,000个元素。在执行期间,使用SetLength(thearray,0)thearray:=nil清除这些数组。在此之后,立即使用SetLength(thearry,newsize)分配一个新的大小。

对于大多数阵列来说,这可以顺利进行。但是偶尔,这些分配中的一个或另一个(每次程序运行时都会分配)崩溃而没有异常或其他通知。崩溃可能发生在清除功能或大小调整功能上。必须使用程序管理器关闭程序,然后重新启动。

真正奇怪的是,导致崩溃的阵列可以根据所使用的内存管理器(本机Delphi,ScaleMM2,FastMM4)而变化。过去,我有时通过重命名数组来解决该问题,但是在多次更改并重新编译后,该问题有时会弹出。

计算机的RAM可以正常运行,并且问题在多台计算机上仍然存在。

1 个答案:

答案 0 :(得分:8)

这是由于代码缺陷,堆损坏,双重释放,缓冲区溢出等导致的。错误的不可预测性与此类错误是一致的。

不要在其他地方查找错误。它不会是内存管理器。不会是硬件。它不会是您的变量的名称。错误是您的代码。

通过拨打诊断工具开始调试。在编译器选项中启用范围检查。切换到FastMM4的完整调试版本。希望这些更改足以隔离故障。如果没有,请减少代码,直到再现最少。这样,您将需要检查的代码更少。