Visual c++ 调用new时调试一个奇怪的错误 我有一个程序,当运行微软Visual C++ 2008的Express在线路上崩溃时 comparison_vectors = new vec_element[(rbfnetparams->comparison_vector_length)+1];

Visual c++ 调用new时调试一个奇怪的错误 我有一个程序,当运行微软Visual C++ 2008的Express在线路上崩溃时 comparison_vectors = new vec_element[(rbfnetparams->comparison_vector_length)+1];,visual-c++,Visual C++,在myprog.exe的0x7c93426d处出现未处理的异常错误:0xC0000005:访问冲突读取位置0x00000000 rbfnetparams->comparison\u vector\u length的计算结果为4(应该执行并在调试器中检查),当我将行更改为测试时,它仍然在这里崩溃: comparison_vectors = new vec_element[5]; vec_元素是一个包含多个int、double和几个bool的结构,但没有方法或构造函数。如果我用malloc替换ne

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

rbfnetparams->comparison\u vector\u length
的计算结果为4(应该执行并在调试器中检查),当我将行更改为测试时,它仍然在这里崩溃:

comparison_vectors = new vec_element[5];
vec_元素
是一个包含多个int、double和几个bool的结构,但没有方法或构造函数。如果我用malloc替换new,它就会运行,但是在其他地方的另一个新的上崩溃。它不会在每次运行这一行时崩溃,只是有时会崩溃,但似乎在每次运行这一行的相同迭代次数后崩溃。在程序中,此时内存使用量仅为10MB

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


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

访问冲突读取位置0x00000000
表示“您取消了对
NULL
指针的引用”。当您到达此行时,它看起来像是偶尔
rbfnetparams
NULL
,因此您会得到错误

我无法解释为什么
比较向量=新的向量元素[5]崩溃。是相同的错误消息吗

检查行之前的
rbfnetparams
是否为
NULL
,并查看是否命中(或添加条件断点)。然后确定
rbfnetparams
NULL
这一事实是否是其他地方更大错误的征兆


取消引用
NULL
指针未定义。Solaris编译器可能会进行优化,以屏蔽该缺陷。(阅读该文章引用的整个系列)。

我觉得这听起来像是堆损坏问题。您是否尝试过在valgrind下运行程序?…或者在VS下运行调试版本,这通常会很快出现堆问题。问题可能不在这一行,而是更早。如果他在Windows上,这将不起作用-Windows没有Valgrind端口。这就是说,如果他的代码可以在*nix系统上编译,他可以检查,但是如果他使用的是Windows约定(如果没有考虑跨平台的话,这很可能),那么他在这方面就不走运了。通常像这样的东西我必须在汇编中调试。感谢valgrind的想法。由于它是跨平台的,solaris版本可以运行,因此它要在linux下编译,而且在程序的早期,2个数组的名称被弄乱了,因此valgrind立即发现了一个非法写入,Visual Studio调试器没有检测到。如果它是作为回答而不是评论发布的,我会接受。分配5时新崩溃的事实证明你找错了方向。“他有一大堆腐败,”穆因达克,通常我会同意你的看法。但“访问冲突读取位置0x00000000”始终表示“
NULL
指针解引用”。它没有其他含义。可能是
NULL
是内存分配例程使用的内部变量,但我对此表示怀疑。我已经看到了足够多的案例,以至于一个“相同的错误”被证明是不相同的,或者被证明是一个不正确的报告,或者在某种程度上被证明是一个骗局,我决定忽略报告的这一部分,并提到我忽略了它。@MaxLybbery:我想我不清楚,他肯定是在取消对
NULL
指针的引用,但是
NULL
指针的原因是堆损坏。
NULL
指针只是巧合的副作用。