我的代码中有很高的内存要求,这个陈述会重复很多次:
Node** x;
x = new Node*[11];
这次分配失败了。我通过将输出抛出到控制台来弄清楚这一行!
我正在Visual Studio上构建我的代码。它在调试模式下工作正常(VS2005和VS2008) 但是它会在VS2005 Release模式下抛出错误。 一个直接的exe生成 cl如果cl来自VS2010,则Program.cpp有效,但当它来自VS2005时失败。 有线索吗?
PS:Linux为我提供了一个总线错误(核心转储) 感谢
更新: 我想,这可能是由于我理解的“未对齐”的原因。我刚刚做了11到12(或任何偶数),它的工作原理!我不知道为什么。它不适用于奇数!
答案 0 :(得分:4)
我认为你已经在其他地方做了一些破坏程序堆的事情:例如,写入已分配的内存块的末尾,或者在释放后写入一块内存。
我建议诊断问题的最简单方法是使用一种旨在检测此类问题的调试器来运行软件,例如valgrind。
答案 1 :(得分:2)
我的代码中有很高的内存要求
你实际上是在用完内存吗?
x = new Node*[11];
您是否正在删除x
:
delete [] x; // the correct way
或:
delete x; // incorrect
或者可能只是有其他东西破坏堆,虽然我原本预计在调试模式下运行会使它更明显,而不是更少。但是由于堆损坏很少有任何保证,它会以一种不错的,易于调试的方式完成。
答案 2 :(得分:2)
此代码没有任何问题。
Node **x;
x = new Node*[11];
您正在为类Node分配11个指针并将其存储为变量x中的双指针。这很好。
程序崩溃的事实可能是由于程序中其他地方发生了一些内存错误。也许你正在写一些过去的数组边界。如果使用for循环加载此数组,请仔细检查索引。
如果您有权访问内存分析器,我建议您使用它。在大型程序中很难找到这些错误。
答案 3 :(得分:2)
如果分配失败,有效的C ++ 98实现将抛出异常(std :: bad_alloc),而不仅仅是崩溃。我同意以前的答案,并建议在valgrind中运行你的程序,因为这会导致内存损坏。 Valgrind应该可以在您选择的Linux发行版中使用。