C++ 调试C+中的明显内存问题+-程序

C++ 调试C+中的明显内存问题+-程序,c++,bad-alloc,C++,Bad Alloc,我正在使用别人创建的程序。我有相当的编码经验,但在C++中编码不是那么多,所以我在这里做了很多“做中学”。 所以这个程序看起来很稳定,我开始了我的工作,主要包括在程序的小部分做一些小的修改。 最近我做了一些性能优化,看起来也很稳定,但两天前我做了一些改变,不断出现崩溃。因此,我恢复了我的更改,仍然得到了崩溃。 我开始对激活的页面堆使用应用程序验证程序和全局标志,并检查所有与堆相关的内容,以找出导致这些问题的原因。因此,从那时起,调试器总是因“std::bad_alloc”错误而崩溃。 因为我使用

我正在使用别人创建的程序。我有相当的编码经验,但在C++中编码不是那么多,所以我在这里做了很多“做中学”。 所以这个程序看起来很稳定,我开始了我的工作,主要包括在程序的小部分做一些小的修改。 最近我做了一些性能优化,看起来也很稳定,但两天前我做了一些改变,不断出现崩溃。因此,我恢复了我的更改,仍然得到了崩溃。 我开始对激活的页面堆使用应用程序验证程序和全局标志,并检查所有与堆相关的内容,以找出导致这些问题的原因。因此,从那时起,调试器总是因“std::bad_alloc”错误而崩溃。 因为我使用的是SVN,所以我也检查了我得到的第一个版本的代码——我也得到了坏的alloc-crash

现在我的问题是:我是否可以绝对肯定,这个启用了应用程序验证程序的坏的alloc崩溃是程序内部错误的一个指示器?当使用应用程序验证程序时,程序本身使用大量内存,大约1-1.1gb,但不再使用。总的系统内存最多使用80-90%,所以我不认为实际的分配问题是由于可用空间太少造成的。
您怎么看?

默认情况下,Windows for x86上的32位进程是(完整地址空间的下半部分)

如果您的程序执行大量的分配和解除分配,或者如果您的程序需要大量的连续分配,那么是的,当您的程序仅使用1.1GB的工作集时,很可能没有足够的连续地址空间来服务分配

(几年前,我参与了一个大型项目,该项目受到地址空间的严格限制。使用1.2到1.4 GB的工作集,“内存不足”是很常见的。)


页面堆肯定会使这个问题更加严重,因为大多数分配比通常情况下要大得多。

默认情况下,Windows for x86上的32位进程是(整个地址空间的下半部分)

如果您的程序执行大量的分配和解除分配,或者如果您的程序需要大量的连续分配,那么是的,当您的程序仅使用1.1GB的工作集时,很可能没有足够的连续地址空间来服务分配

(几年前,我参与了一个大型项目,该项目受到地址空间的严格限制。使用1.2到1.4 GB的工作集,“内存不足”是很常见的。)


页面堆肯定会使这个问题更加严重,因为大多数分配比通常情况下要大得多。

您应该研究二进制文件在使用std::bad_alloc崩溃时接收到的堆栈

通常,这应该是因为
new
无法分配内存。使用堆栈,您应该能够知道请求了多少内存,如果它对您来说是陌生的(例如“allocate 3Go,please!”),那么您就知道错误所在

阅读您的问题时不清楚,但如果您的意思是该过程使用了80%-90%的可用虚拟内存,那么您的内存可能是碎片化的,并且您试图分配一个太大的对象,无法容纳剩余的可用小内存块。。。 因此,尽管您的进程仍有内存可供使用,但糟糕的alloc仍然存在


在代码中进行搜索以查看代码的某些部分是否手动抛出bad_-alloc也是一个好主意。

您应该研究二进制文件使用std::bad_-alloc崩溃时接收到的堆栈

通常,这应该是因为
new
无法分配内存。使用堆栈,您应该能够知道请求了多少内存,如果它对您来说是陌生的(例如“allocate 3Go,please!”),那么您就知道错误所在

阅读您的问题时不清楚,但如果您的意思是该过程使用了80%-90%的可用虚拟内存,那么您的内存可能是碎片化的,并且您试图分配一个太大的对象,无法容纳剩余的可用小内存块。。。 因此,尽管您的进程仍有内存可供使用,但糟糕的alloc仍然存在


在代码中执行搜索,以查看代码中的某个部分是否手动抛出BADYOLLC也是一个好主意。

< P>不,您不能对任意C++程序中的任何东西绝对确定,因为程序可能包含未定义的行为(实际上,它几乎肯定是这样的,尽管它可能与当前的问题无关)。也就是说,
std::bad_alloc
的常见原因是无法分配内存


用于设置自定义
新\u处理程序
,并在其中放置断点。如果断点被触发,那么你的问题几乎肯定是无法分配内存(并且程序的状态在调试这个问题时可能是有用的)。< / P> < P>不,你不能完全确定任意C++程序中的任何东西,因为你的程序可能包含未定义的行为。(事实上,这几乎可以肯定,尽管它可能与当前的问题无关)。也就是说,
std::bad_alloc
的常见原因是无法分配内存


用于设置自定义
新\u处理程序,并在其中放置断点。如果触发断点,则几乎可以肯定您的问题是无法分配内存(此时程序的状态可能有助于调试您的问题).

std::bad_alloc
也可能是由于将
NULL
传递给
std::string
而导致的(以及其他一些潜在原因)。这不仅仅是在耗尽内存时引发的。你能给我们看一下这方面的代码吗?@Borealid:
std::bad\u alloc也可能是由于将NULL传递给std::string而引起的。
:根据,如果指针为NULL