2012-04-19 48 views
0

具有运行使用Microsoft Visual C编译时++ 2008 Express的上线调试新时被称为

comparison_vectors = new vec_element[(rbfnetparams->comparison_vector_length)+1]; 

与MYPROG.EXE在0x7c93426d错误未处理的异常崩溃的程序奇怪的错误:0000005:访问冲突阅读位置00000000

rbfnetparams->comparison_vector_length计算结果为4(应该做的,并在调试器中检查),而且当我改变行作为测试的东西仍然崩溃的位置:

comparison_vectors = new vec_element[5]; 

vec_element是一个有几个整数,双打和几个布尔的结构,但没有方法或构造函数。如果我用malloc替换new,然后在另一个新的地方崩溃,这个事情就会运行。它每次运行时都不会崩溃,只是有时会出现这种情况,但似乎每次执行相同次数的迭代后都会崩溃。内存使用量在这个程序中只有10MB。

这会变得很陌生,因为同一个程序在Solaris上编译和运行在gcc下,通常显示的错误远远多于Windows。

任何帮助将不胜感激,因为我在如何调试这一个损失。

+4

这听起来像是一个堆腐败问题给我。你有没有尝试在valgrind下运行该程序? – JaredPar 2012-04-19 18:43:49

+4

...或者在VS本身下运行Debug版本,这通常会很快出现堆问题。问题可能不在这条线上,但更早。 – 2012-04-19 18:46:05

+1

如果他在Windows上,这将无法工作 - 不适用于Windows的Valgrind端口。也就是说,如果他的代码可以在* nix系统上编译,他可以检查,但是如果他使用的是Windows约定(如果跨平台不存在,这很有可能),那么他将会不幸运。 – RageD 2012-04-19 18:46:32

回答

1

Access violation reading location 0x00000000表示“你取消了一个NULL指针。”它看起来像有一段时间rbfnetparamsNULL当你到达这条线,因此你得到的错误。

我无法解释为什么comparison_vectors = new vec_element[5];崩溃。这是相同的错误信息?

检查行之前是否有rbfnetparamsNULL,看它是否被命中(或添加了条件转折点)。然后确定rbfnetparams是否为NULL是其他地方的更大错误的症状。

取消引用NULL指针是未定义的。 Solaris编译器可能会执行一个掩码错误的优化。 That's allowed by the Standard(阅读从该帖子引用的整个系列)。

+0

事实上,当分配5时出现新的崩溃就证明你正在吠叫错误的树。他有堆腐败。 – 2012-04-20 09:32:43

+0

@MooingDuck,通常我会同意你的看法。但“访问冲突读取位置0x00000000”始终表示“NULL”指针解除引用。“它没有其他含义。它可能是'NULL'是内存分配例程使用的内部变量,但我怀疑它。我已经看到了足够的案例,证明“相同的错误”不是完全相同的,或者是一个不正确的报告,或者在某种程度上被证明是我决定忽略那部分的红鲱鱼的报告,并提及我忽略它。 – 2012-04-20 14:33:00

+1

@MaxLybbery:我想我并不清楚,他肯定会解引用NULL指针,但NULL指针的_cause_是堆损坏。 NULL指针只是一个巧合的副作用。 – 2012-04-20 18:01:50