程序在IDE外部运行时崩溃 我目前正在研究Windows XP中的一个C++程序,它处理大量的数据集。我们最大的输入文件导致程序意外终止,没有任何错误消息。有趣的是,当程序从我们的IDE(Code::Blocks)运行时,处理文件时不会出现任何此类问题

程序在IDE外部运行时崩溃 我目前正在研究Windows XP中的一个C++程序,它处理大量的数据集。我们最大的输入文件导致程序意外终止,没有任何错误消息。有趣的是,当程序从我们的IDE(Code::Blocks)运行时,处理文件时不会出现任何此类问题,c++,memory,crash,C++,Memory,Crash,当数据被处理时,它被放置到树结构中。在完成计算之后,数据在被发送到OpenGL中之前被移动到C++ STL向量中。 我希望能对这次事故的原因有所了解。我已经签出了另一个帖子,因为我是新用户,所以无法发布链接。文章中的问题与我的问题非常相似,是由数组的越界索引引起的。然而,我很确定没有发生这样的越界错误 我想知道,在为向量分配空间时,数据集的大小是否会导致问题。理论上,我测试程序的系统应该有足够的内存来处理数据(2GB的RAM,数据集大约占1GB)。当然,如果内存可用,STL向量在达到其容量时只需

当数据被处理时,它被放置到树结构中。在完成计算之后,数据在被发送到OpenGL中之前被移动到C++ STL向量中。 我希望能对这次事故的原因有所了解。我已经签出了另一个帖子,因为我是新用户,所以无法发布链接。文章中的问题与我的问题非常相似,是由数组的越界索引引起的。然而,我很确定没有发生这样的越界错误

我想知道,在为向量分配空间时,数据集的大小是否会导致问题。理论上,我测试程序的系统应该有足够的内存来处理数据(2GB的RAM,数据集大约占1GB)。当然,如果内存可用,STL向量在达到其容量时只需将其分配的空间翻倍


谢谢,埃里克你的记忆模型是什么样子的?您是否遇到了索引限制(即sizeof int)?

代码在IDE中工作(可能在调试器中运行),但不是独立的这一事实向我表明,这可能是一个初始化问题。

将警告级别设置为max的编译器

然后检查所有警告。我猜它是一个未初始化的变量(在调试模式下被初始化为NULL/0)


就我个人而言,我已经设置了模板,以便警告始终处于最大值,并且警告被标记为错误,这样编译将失败。

您可能会发现配置O/S以创建崩溃转储(可能,我不知道,仍然使用一些名为“Dr Watson”的Windows系统软件)很有帮助,在程序崩溃后(假设程序正在崩溃),您可以将调试器附加到该调试器


您还应该捕获程序在不发生崩溃转储的情况下半正常退出的各种方式:
atexit
set\u unexpected
set\u terminate
以及其他可能的方式。

听起来您的程序正在抛出一个您无法捕获的异常。具有一些异常处理程序,可以快速定位异常位置

树结构中是否存在可能溢出的索引?您是否在向量中使用超出向量当前大小的索引

new vector...    
vector.push_back()
vector.push_back()
vector[0] = xyz
vector[1] = abc
vector[2] = slsk // Uh,oh, outside vector
最大的输入集有多大?您最终会分配大小*大小元素吗?如果是,最大输入集是否大于65536个元素(65536*65536==MAX_INT)

我同意IDE在单机版无法正常工作的最可能原因是调试器正在将内存擦除为0或在分配的内存周围使用内存保护


如果没有其他方法,是否可以减小数据集的大小,直到找到正确的大小,以及一个稍大的失败示例—这可能是有用的。

我建议尝试确定导致崩溃的大致代码行

由于这只发生在IDE之外,因此可以使用
OutputDebugString
输出当前位置,并使用DebugView

实际上,为在IDE内部和外部进行调试而编译的程序的行为可能完全不同。当从IDE加载程序时,它们可以使用一组不同的运行时库


最近,我的代码中出现了一个计时错误,不知怎的,当从IDE进行调试时,计时总是很好的,没有发现错误,但在发布模式bam中,错误就在那里。这种bug真的是一个需要调试的问题。

事实证明,我们的硬件已经达到了极限。程序达到了系统的内存限制,失败得很惨。在我从命令行将cerr连接到一个文件之前,我们甚至无法看到生成的错误语句(感谢starko)。谢谢你所有有用的建议

当你在IDE之外运行应用程序时,你会重新编译它吗?您正在运行调试版本吗?我已经尝试了调试版本和发布版本,两者都会产生相同的结果。DLL呢?你是在链接DLL还是类似的东西?您是否尝试过通过cmd行与shell运行它?为什么在发生异常时不能将调试器附加到进程?有一些DLL从GTK+和GtkGlExt库链接进来。虽然我没有想过从命令行运行…理论上我可以精确地指出错误发生的确切大小,但是正如我在原始帖子的评论中提到的,测试用例足够大,因此这是不可行的。事实上,数据集可能足够大,足以命中整数溢出,我已将其放入要检查的事情队列中。如果您确实想找到正确的大小,您可以执行二进制搜索-删除一半数据,再放入四分之一,删除1/8,等等。只有在删除/添加数据相对容易的情况下,这才有效。你在最后一句话中就把问题解决了。输入文件被大量地操作到数据中,这些数据被放入到树中,最后是向量中。我真的没有办法从最终数据集中消除任何设置数量,而不进行一些严重的黑客攻击,在数据读入后很好地扔掉东西。不过,在更简单的情况下,这当然是个好建议。谢谢你一直以来的帮助!对于您所说的初始化问题,我们非常感谢您的进一步解释。