【发布时间】:2013-02-23 01:56:10
【问题描述】:
我正在使用其他人创建的程序。我在编码方面有相当多的经验,但在 C++ 编码方面没有那么多经验,所以我在这里做了很多“边做边学”。 所以这个程序看起来很稳定,我开始了我的工作,主要包括对程序的小部分进行小修改。 最近做了一些性能优化,看起来也很稳定,但是前两天我改了一些东西,一直在崩溃。所以我恢复了我的更改,但仍然出现崩溃。 我开始使用带有激活页面堆的应用程序验证器和全局标志,并检查所有与堆相关的内容以找出导致这些问题的原因。因此,从那时起,调试器总是因“std::bad_alloc”错误而崩溃。 因为我使用的是 SVN,所以我还检查了我得到的代码的第一个版本 - 我也在那里遇到了 bad_alloc-crash。
现在我的问题是:我可以绝对肯定,启用应用程序验证程序的这个 bad_alloc 崩溃是程序内部错误的指标吗?使用应用程序验证程序时,程序本身会使用大量内存,大约 1-1.1gb,但不再使用了。总系统内存最多使用了 80-90%,所以我不认为有可用空间太少导致的实际分配问题。 你怎么看?
【问题讨论】:
-
std::bad_alloc也可以通过将NULL传递给std::string引起(以及其他几个潜在原因)。它不仅仅在耗尽内存时引发。 -
你能告诉我们任何代码吗?
-
@Borealid:
std::bad_alloc can also be caused by passing NULL to an std::string:根据cplusplus.com,如果指针为NULL,那么它会导致未定义的行为。阅读标准,我看到字符串构造函数:“要求:s 不应是空指针”,这对我来说是“未定义的行为”的味道...... -
Application Verifier 修改堆,以便当页面被释放时,它们被特别标记并且不能被重用。对于具有大量内存需求或大量分配/释放的应用程序,应用程序验证程序通常会导致应用程序耗尽内存,这种方式不一定表明应用程序本身存在问题。
-
几乎不涉及任何字符串,因此这不太可能导致问题。而且实际上不可能向您展示任何代码,因为它太多了 - 而且由于崩溃是在某个明显随机的位置引起的,因此没有任何代码可以帮助您。 @Chad:谢谢-我认为可能存在这样的问题。实际上,该程序必须进行许多分配/解除分配。事实上,这就是我正在努力加快速度的方法,即内存池。