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
...全文
90 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
惜愿 2010-03-23
  • 打赏
  • 举报
回复
谢谢楼上的回复~
dixiad 2010-03-22
  • 打赏
  • 举报
回复
不懂,mark先
stjay 2010-03-22
  • 打赏
  • 举报
回复
* 该方法是否只是检测了NEW 与 DELETE的配对,而不检测是否真的完全释放了内存?(比方说:我申请了1024个字节,只释放了512个字节,是否会输出泄露呢?我不知道如何去写这样的代码来测试这个问题,请高手原谅.)

可以去看看new的内部算法
new出来的内存 前后都会预留一些空间,用来存放标志位等数据,一般溢出检查就是判断这些(后面的)标志位数据是否被修改了,前面的数据应该含有状态等数据,一些链表结构,也是delete要修改的数据,所以不会new了内存,只delete释放一部分内存的情况,除非用错操作符,或者前面的数据被非法改动了。

* 为什么程序在持续执行的过程中本该是安全的操作会造成程序执行使用的内存空间的扩大呢?貌似new后delete,不会马上返还给系统,可能是想提高new的效率
使用内存操作API,可能消除此现象
stjay 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhoutanliang 的回复:]
比如申请的是char* a = new char[10];

但释放的是delete a;//如果能通过编译

当然会导致内存泄露啊
[/Quote]

这个应该会先报delete操作异常(本应是delete[] a)
AlanBruce 2010-03-22
  • 打赏
  • 举报
回复
比如申请的是char* a = new char[10];

但释放的是delete a;//如果能通过编译

当然会导致内存泄露啊

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧