C++ 什么时候会发生内存泄漏?

C++ 什么时候会发生内存泄漏?,c++,memory-leaks,windows-xp,C++,Memory Leaks,Windows Xp,我不知道该怎么想 我们有一个作为服务运行的组件。它在我的本地机器上运行得非常好,但在其他一些机器上(两台机器上的RAM都等于2GB),它开始在第二天和连续几天生成bad_alloc异常。问题是进程的内存使用保持不变,大约为50Mb。另一件奇怪的事情是,通过跟踪消息,我们已经本地化了要从stringstream对象抛出的异常,该对象只向流中插入不超过1-2kb的数据。如果有必要的话,我们正在使用STL端口 现在,当你得到一个坏的alloc异常时,你认为这是内存泄漏。但是所有的我们的手动分配都包含在

我不知道该怎么想

我们有一个作为服务运行的组件。它在我的本地机器上运行得非常好,但在其他一些机器上(两台机器上的RAM都等于2GB),它开始在第二天和连续几天生成bad_alloc异常。问题是进程的内存使用保持不变,大约为50Mb。另一件奇怪的事情是,通过跟踪消息,我们已经本地化了要从stringstream对象抛出的异常,该对象只向流中插入不超过1-2kb的数据。如果有必要的话,我们正在使用STL端口

现在,当你得到一个坏的alloc异常时,你认为这是内存泄漏。但是所有的我们的手动分配都包含在一个智能指针中。此外,我无法理解当整个进程仅使用~50Mb内存时,stringstream对象如何会缺少内存(内存使用量每天几乎保持不变(当然不会增加)

我不能给你提供代码,因为这个项目太大了,抛出异常的部分除了创建一个stringstream和一个预感之外什么都不做

但我过去在分配数组时遇到过麻烦

int array1[SIZE];  // SIZE limited by COMPILER to the size of the stack frame
当大小是一个大数字时

解决办法是与新操作员进行分配

int* array2 = new int[SIZE];  // SIZE limited only by OS/Hardware
我发现这非常令人困惑,原因是Martin York在解决方案中讨论的堆栈框架:

祝你一切顺利


Tom

使用来自sysinternals的检查机器上其他进程的配置文件-如果内存不足,即使不是您造成内存压力,您也会得到
bad\u alloc


检查您自己的内存使用情况,以获取快照并比较一段时间内的使用情况。您必须在周期的早期这样做,以避免炸毁工具,但如果您的流程行为没有随时间而退化(即没有突然的病理行为)您应该获得有关其在时间
T
与时间
T+T
时的内存使用情况的准确信息。您描述中的一个可能原因是,由于代码中的错误,您试图分配一个大小不合理的块。像这样的东西

 size_t numberOfElements;//uninitialized
 if( .... ) {
    numberOfElements = obtain();
 }
 elements = new Element[numberOfElements];
现在,如果未初始化
numberOfElements
,它可能包含一些不合理的大数字,因此您可以有效地尝试分配一个内存管理器拒绝执行的3GB块


因此,这可能不是因为您的程序内存不足,而是因为它试图分配的内存超过了即使在最佳条件下可能允许分配的内存。

bad\u alloc
并不一定意味着内存不足。由于堆已损坏,分配函数也可能失败。您可能会出现缓冲区溢出或代码写入已删除内存等情况


您也可以使用或其中一个来查找泄漏/溢出。

我不明白流为什么会抛出。您没有失败进程的转储吗?或者将调试器附加到它以查看分配器正在尝试分配什么


<>但是如果你超载了<代码>运算符> P>另一个远射:你不说错误发生在哪三个操作中(例如,构造,代码> > P>,当你在C++中使用<代码>新< /COD>运算符时,内存泄漏会发生,并且忘记使用<代码>删除< /代码>运算符。
或者,换句话说,当你分配一块内存时,你忘记了释放它。

@skwllsp:我真不敢相信内存碎片会导致分配1~2kb内存失败,而只使用了50MB,是吗?如果这是碎片,我无法理解为什么在足够的运行时间后不会在本地发生。看起来像复制是针对另一台机器的某些特性的。当你说它只使用50Mb时,你的意思是它的内存大小永远不会超过50Mb,还是它的分配总和不会超过50Mb?一个小程序可以很容易地分配/释放比它在任何给定时刻使用的内存都多的内存,垃圾收集可能因机器而异Process Explorer会显示
虚拟大小
以及其他详细的每个进程统计信息-如果一个或多个进程贪婪,它会告诉您。
 ~className(){

 //delete stuff in here

}
 ~className(){

 //delete stuff in here

}