我在我的n-body模拟器中实现了“Barnes-Hut”算法,我遇到了一个问题。
我的程序会崩溃,与内存相关的异常,主要是stack overflow
异常。
使这个奇怪的错误接收的事情是它不会在固定的时间发生,它似乎突然出现。使用任务管理器我可以清楚地看到没有内存泄漏,我一直非常小心地避免这种情况。不过,我会使用递归和对象中的对象。
是否有可能需要包含oct-tree的最大深度,这是导致错误的原因?
答案 0 :(得分:0)
最大递归深度确实受到堆栈大小的限制 堆栈大小不与完整RAM内存大小相同 例如。在Windows上,默认堆栈大小(每个线程)是1MB,仅此而已。
可以为你的程序重新配置它,和/或“捕获”堆栈溢出错误而不会导致整个程序崩溃(后者相当脏,但至少可能)。
尽管如此,最好的解决方案是修改代码以摆脱递归。所有递归都可以用迭代解决方案替换,但它可能会更复杂一些。并且每个函数调用的数据可以移动到向量等,每次调用一个条目,这样动态分配的向量存储器就可以使用整个RAM。