C++内存管理方面的疑问
惜愿 2010-03-22 09:13:26 这个问题要从我看的一篇关于内存池的文章说起.之前发过一贴问过一些内存释放安全上的问题,经过一些方法测试,认为没有内存泄露了.于是又产生了新的疑问希望高手能帮助解答.....
VC内存检测的方法我采用了
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <string.h>
#include <stdio.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
然后在要检测的代码前面加上:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
在后面加上:
_CrtDumpMemoryLeaks();
该方法我并不知道是不是有什么缺陷,像是:我new了一块空间,同时我DLETE了它,程序不会有泄露输出,如果我NEW了一块空间并且在最后调用 _CrtDumpMemoryLeaks(); 的时候没有调用DELETE它会输出什么位置申请的内存没有释放.我的疑问就成了:
* 该方法是否只是检测了NEW 与 DELETE的配对,而不检测是否真的完全释放了内存?(比方说:我申请了1024个字节,只释放了512个字节,是否会输出泄露呢?我不知道如何去写这样的代码来测试这个问题,请高手原谅.)
第二个问题是关于程序运行的.我知道内存如果有没有释放的话程序会持续增长,今天我在测试自己的内存池实现的时候,运行代码的时候发现,程序进行了一次增长,然后就固定在一个数值,并没有恢复到程序刚开始执行时的内存标准.
然后我运行了网络中一些内存测试方法,在循环执行的时候,发现每执行一次测试,内存就有一个固定增长.
* 为什么程序在持续执行的过程中本该是安全的操作会造成程序执行使用的内存空间的扩大呢?
如果这些问题比较简单.前辈们可以不回答.告诉我该看什么书就可以了.麻烦大家了....
自己的内存池采用了重载 operator new and delete 操作符号.
void* operator new(size_t nSize,USHORT nCount,USHORT nUnitSzie){
return ::operator new(nSize+ nCount * nUnitSzie);
}
void operator delete(void* lp,USHORT,USHORT){
::operator delete(lp);
}
void operator delete(void* lp,size_t){
::operator delete(lp);
}
内存申请测试的采用申请操作分别是:
malloc new VirtualAlloc HeapAlloc