C++-C++中内存释放问题

发布于 2016-10-20 12:20:57 字数 465 浏览 1169 评论 2

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灵芸 2017-02-03 15:55:14

说说我的想法吧,首先我觉得不是因为没释放导致内存增加的
在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下运行的时候,分配内存就不会有这么多附加信息。
这个可能是内存变大的众多因素中的一个吧。希望大牛补充,完善

浮生未歇 2016-12-19 13:17:33

我觉得并没有因为使用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通常不会把内存立即释放给操作系统,而是保留以备我们接下来可能的其他内存分配操作,只是将其返还给了内存池。因此,我们在任务管理器中看到虽然我们执行了内存释放操作,但是之后内存并没有减少得和先前一样少。这是操作系统的一种优化技术吧,实际的内存释放可能会在程序终止的时候发生。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文