C++-C++中内存释放问题
class Buf
{
public:
Buf(size_t size)
{
_storage.reserve(size);
}
~Buf()
{
/*vector<int> temp;
_storage.swap( temp );*/
}
vector<int> _storage;
};
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0;
while( ++i < 10000)
{
Buf *buf = new Buf(100000);
delete buf;
}
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
说说我的想法吧,首先我觉得不是因为没释放导致内存增加的
在DEBUG模式下运行程序的时候。如果程序内部有动态申请的内存空间。那么系统生成一个链表,来管理动态分配了的内存。这个链表上的每个节点,都是一个_CrtMemBlockHeader结构,其大概结构如下。这个我在别的帖子回答的时候也贴过
typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
struct _CrtMemBlockHeader *pBlockHeaderPrev;
char *szFileName; // File name
int nLine; // Line number
size_t nDataSize; // Size of user block
int nBlockUse; // Type of block
long lRequest; // Allocation number
// Buffer just before (lower than) the user's memory:
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
其中在真正分配的内存块之前,都有这些信息来管理这个分配的内存块,从结构中可以看出,包括下个块上个块,分配地址所在文件的名字行数等等,都有记录。但是一个问题就是,delete掉内存之后,这个结构体中的节点并没有释放。只是标识未释放。后面再申请的时候可以再用。这也是很多内存泄露检测工具的原理。所以,在Debug下运行的时候,即使你释放了,你也会发现内存并没有入预期减少。但是在Release下运行的时候,分配内存就不会有这么多附加信息。
这个可能是内存变大的众多因素中的一个吧。希望大牛补充,完善
我觉得并没有因为使用vector或者deque而导致内存泄露。
关于第一段代码,我把while语句去掉,即创建对象和释放对象只执行一次的时候,占用内存依然是700K左右。
#include <iostream>
#include <vector>
using namespace std;
class Buf
{
public:
Buf(size_t size)
{
_storage.reserve(size);
}
~Buf()
{
vector<int> temp;
_storage.swap( temp );
}
vector<int> _storage;
};
int main()
{
int i = 0;
/* while( ++i < 2)
{ */
Buf *buf = new Buf(100000);
delete buf;
//}
return 0;
}
程序运行时候的内存和你在代码中分配的内存应该是两码事,不能混为一谈的。
不知道这个内存碎片会不会算上,求大神详解~~
----------------------------------------------------------------------------------
更新一下:
我又重新差了一下资料,找到了比较合理的解释了。
当我们在程序中释放内存的时候,Standard memory allocator通常不会把内存立即释放给操作系统,而是保留以备我们接下来可能的其他内存分配操作,只是将其返还给了内存池。因此,我们在任务管理器中看到虽然我们执行了内存释放操作,但是之后内存并没有减少得和先前一样少。这是操作系统的一种优化技术吧,实际的内存释放可能会在程序终止的时候发生。