2011-12-13 32 views
0

我已为光线跟踪应用程序实现了专门的树数据结构。我在每个树的节点中使用std :: list来存储数据项。我在运行应用程序时出现问题,使用此数据结构时,不仅会崩溃应用程序,还会冻结整个操作系统(Windows 7)。这仅在发布模式下发生;在调试模式下需要更长的时间(如预期的那样),但工作正常。我正在使用Visual Studio 2010.在发布模式下运行(Ctrl + F5)或调试(F5)都会导致整个系统崩溃。C++完全系统崩溃,仅限发布模式

从我迄今为止发现的情况来看,释放模式和调试模式之间的不同行为似乎归因于内存泄漏,因为调试模式(从我所了解的内容来看)有点宽容。但是,我没有发现任何关于C++应用程序崩溃的操作系统。

我只想知道在什么情况下会发生这种行为,所以我知道在哪里看。将问题简化为简单并追踪问题是困难的,因为它具有高度并行性和处理大量数据的光线追踪性质。

哦,问题是不是一个无限递归导致堆栈溢出。我故意实现了这一点,并没有使操作系统崩溃。

+3

很大的功能从用户空间代码冻结Windows 7。你说这是大规模并行和大量的数据,可能是因为你耗尽了资源,并且使整个系统濒临停滞。我有应用程序通过运行所有可用的RAM和交换来关闭Linux机器,成为一个3分钟的任务切换到终端,并尝试杀死应用程序。 –

+0

如果您的代码是可移植的,请尝试在更稳定的操作系统上进行编译,并找出错误的原因。通过崩溃操作系统进行调试需要很长时间。 – thiton

+0

如果您使用调试信息构建发行版本,它会正常工作吗?否则,它可能会帮助您缩小发生碰撞事故的地点。 –

回答

2

您是否在调试模式下检查了内存使用情况?过度的内存使用和溢出会降低系统的速度 - 地狱 - 你的系统可能没有技术上的崩溃 - 只是变得非常慢。在发布模式下,所有的分配将以相当快的速度发生 - 因此您可能需要查看内存使用情况。

正如你所说,无限递归不会导致他的操作系统崩溃 - 它总是导致分段错误。

+2

是的,这正是我想要得到的,应用程序可以快速地分配内存和CPU,调度程序甚至不会看到它来,一旦你点击swap/pagefile,它基本上是游戏结束。 –

+0

我刚刚在调试和发布模式中进行了检查。在调试模式下,内存的增加非常少,并且有足够的空间。在释放模式下,它会启动并且系统冻结。所以,是的,你们对撞车的原因都是正确的。但是为什么我在Debug模式下看不到相同的内存浪涌? – Gigi

+0

对不起,不能给你一个确信的答复..但它可能与C++运行时库如何在发布模式下处理动态内存分配和释放有关。搜索这些行可能会有所帮助。 – shekhar