使用C ++ Builder 2010进行系统构建,在运行约20小时后,它会开始触发断言失败。
断言失败:xdrPtr&& xdrPtr == * xdrLPP,文件xx.cpp,第2349行
尝试谷歌就像疯了但没多少信息。有些人似乎在 xx.cpp 中引用了一堆不同的断言来解决C ++ Builder中异常处理的缺点。但我没有在文件中找到任何引用此特定行的内容。
我们已经集成了 madExcept ,它似乎在某个地方捕获了内存异常,但不确定它是否已连接。无论断言触发什么都不正确。
修改 我发现了一个if语句的实例,它作为语句的一部分使用了一个可能引发异常的函数。我想知道这是否可能成为弄乱异常处理流程的罪魁祸首?
考虑
if(foo() == 0) {
...
}
包装在try catch块中。 如果从foo()中抛出异常,那么这里没有返回int,if语句将如何反应?我认为它仍然可能尝试完成执行该行,并执行if检查函数的返回,这将barf,因为没有返回int。这个定义得很好还是这个未定义的行为? 不会
int fooStatus = foo();
if(fooStatus == 0) {
...
}
更好(或者我应该说更安全)?
编辑2:
我只是设法在我的开发机器上获得断言(应用程序只是闲置),没有任何关于内存弹出的例外,应用程序只消耗大约100 MB。所以他们可能没有联系。
试着看看我是否能再次抓住它并看看它在哪里barfs。
编辑3:
管理抓住它。首先是解释的断言失败通知。然后调试器向我显示此异常通知。
如果我打破它,请将我带到代码中
它实际上突出显示了
之后的第一个代码行pConnection->Open();
但似乎我可以将此更改为任何内容,并且该行仍然会突出显示。所以我的猜测是错误是在它上面的代码中以某种方式。在RAD Studio中使用数据库时,我看到有关人们获得此类断言失败的更多报道......嗯。
更新
如果无法访问数据库服务器,我发现了一个递归调用它自己的执行函数的线程。我认为这至少是问题的一部分。这将继续尝试,随着越来越多的工作线程产生,并继续尝试它只能在灾难中结束。
答案 0 :(得分:0)
如果madExcept暗示你的内存不足,那么如果指针为NULL(即分配失败),则断言可能会失败。断言发生时,xdrPtr和xdrLPP的值是多少?你能追溯到他们分配的地方吗?
我会开始寻找内存泄漏。