-1

我的代码中有很高的内存要求,并且此语句重复了很多次:

Node** x;
x = new Node*[11];

它在此分配中失败。我通过将输出扔到控制台来找出这条线!

我正在 Visual Studio 上构建我的代码。它在调试模式下工作正常(在 VS2005 和 VS2008 中)但是它在 VS2005 发布模式下抛出错误。如果 cl 来自 VS2010,则从 cl Program.cpp 生成的直接 exe 有效,但如果来自 VS2005,则失败。有什么线索吗?

PS:Linux 给了我同样的总线错误(核心转储)谢谢

更新:我想,据我所知,这可能是由于“未对齐”的事情。我刚做了 11 到 12(或任何偶数),它有效!!!我不知道为什么。它不适用于奇数!

更新 2: http: //www.devx.com/tips/Tip/13265

4

4 回答 4

4

我认为您在其他地方做了一些破坏程序堆的事情:例如,写入超过分配的内存块的末尾,或者在释放内存块后写入。

我建议诊断问题的最简单方法是使用旨在检测此类问题的调试器运行软件,例如valgrind

于 2009-11-08T20:04:17.350 回答
2

我的代码对内存有很高的要求

你真的是内存不足了吗?

x = new Node*[11];

你是x这样删除的:

delete [] x;   // the correct way

或者:

delete x;  // incorrect

或者可能只是有其他东西破坏了堆,尽管我原以为在调试模式下运行会使它更明显,而不是更少。但是对于堆损坏,很少有任何保证它会以一种很好的、​​易于调试的方式这样做。

于 2009-11-08T20:06:12.417 回答
2

这段代码没有任何问题。

Node **x;
x = new Node*[11];

您正在分配 11 个指向类 Node 的指针并将其作为双指针存储在变量 x 中。这可以。

您的程序在这里崩溃的事实可能是由于程序中其他地方发生的一些内存错误。也许您正在某处写过去的数组边界。如果您使用 for 循环加载此数组,请仔细检查您的索引。

如果您可以访问内存分析器,我建议您使用它。在大型程序中很难追踪这些错误。

于 2009-11-08T20:08:01.820 回答
2

如果分配失败,有效的 C++98 实现将抛出异常 (std::bad_alloc),而不仅仅是崩溃。我同意以前的答案,并建议在 valgrind 中运行你的程序,因为这有内存损坏的味道。Valgrind 应该在您选择的 Linux 发行版中可用。

于 2009-11-08T21:16:28.640 回答