0

我有一个程序,当使用 Microsoft Visual C++ 2008 Express 编译运行时会崩溃

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

在 myprog.exe 中的 0x7c93426d 处出现错误未处理的异常:0xC0000005:访问冲突读取位置 0x00000000

rbfnetparams->comparison_vector_length评估为 4(应该这样做并在调试器中检查),当我将行更改为测试时,事情仍然在这里崩溃:

comparison_vectors = new vec_element[5];

vec_element是一个具有多个整数、双精度和几个布尔值的结构,但没有方法或构造函数。如果我用 malloc 替换 new ,事情就会运行,但随后会在其他地方的另一个 new 上崩溃。每次运行这条线时它都不会崩溃,只是有时会崩溃,但似乎在每次这条线的迭代次数相同之后都会崩溃。此时程序中的内存使用量仅为 10MB。

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

任何帮助将不胜感激,因为我不知道如何调试这个。

4

1 回答 1

1

Access violation reading location 0x00000000意思是“你取消引用了一个NULL指针。” 看起来偶尔rbfnetparamsNULL你到达这条线的时候,因此你得到了错误。

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

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

取消引用NULL指针是未定义的。Solaris 编译器可能会进行优化以掩盖该错误。 这是标准允许的(阅读该帖子引用的整个系列)。

于 2012-04-20T08:35:44.040 回答