我正在使用Delphi 10.1和Windows 10,以及所有当前更新。
我的应用程序使用并重复使用大量动态数组(50个或更多),每个数组最多包含5,000个元素。在执行期间,使用SetLength(thearray,0)
或thearray:=nil
清除这些数组。在此之后,立即使用SetLength(thearry,newsize)
分配一个新的大小。
对于大多数阵列来说,这可以顺利进行。但是偶尔,这些分配中的一个或另一个(每次程序运行时都会分配)崩溃而没有异常或其他通知。崩溃可能发生在清除功能或大小调整功能上。必须使用程序管理器关闭程序,然后重新启动。
真正奇怪的是,导致崩溃的阵列可以根据所使用的内存管理器(本机Delphi,ScaleMM2,FastMM4)而变化。过去,我有时通过重命名数组来解决该问题,但是在多次更改并重新编译后,该问题有时会弹出。
计算机的RAM可以正常运行,并且问题在多台计算机上仍然存在。
答案 0 :(得分:8)
这是由于代码缺陷,堆损坏,双重释放,缓冲区溢出等导致的。错误的不可预测性与此类错误是一致的。
不要在其他地方查找错误。它不会是内存管理器。不会是硬件。它不会是您的变量的名称。错误是您的代码。
通过拨打诊断工具开始调试。在编译器选项中启用范围检查。切换到FastMM4的完整调试版本。希望这些更改足以隔离故障。如果没有,请减少代码,直到再现最少。这样,您将需要检查的代码更少。