关于MFC中CMemoryState的一些使用

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

确切的说,在C++中对内存的管理是挺复杂的,申请内存的同时也必须记得释放内存,new匹配delete, new[]匹配delete[].还有更困难的是在涉及到组模(Module),这点暂不讨论,等我搞清楚后会和大家分享。现在先说一下CMemoryState,如有什么不足之处,或者是错误的地方,请各位看官不吝赐教,谢谢。

 

在MFC中,可以使用CMemoryState检测内存泄露,内存的泄露是由于程序在内存分配和检索中错误使用了C++的new或delete操作符导致的。我们可以创建CMemoryState对象,来快速查看当前内存的分配情况,不多说了,直接代码吧!

 

1. 没有 delete.

Output:

1-------------------
Dumping objects ->
e:/test/ccing.cpp(101) : {140} normal block at 0x003B8A10, 6 bytes long.
 Data: <      > CD CD CD CD CD CD
Object dump complete.
2-------------------
Memory Lack!
3-------------------

0 bytes in 0 Free Blocks.
6 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 6 bytes.
4-------------------
Detected memory leaks!
Dumping objects ->
e:/test/ccing.cpp(101) : {140} normal block at 0x003B8A10, 6 bytes long.
 Data: <      > CD CD CD CD CD CD
Object dump complete.

大家可以看到,申请多少了内存,内存被分配到什么地方都有说明,最后还提示内存泄露!

 

2. 加入delete

Output:

2-------------------
3-------------------

0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 6 bytes.
4-------------------

都释放干净了。

 

3. 测试一些数据类型.

    (1).c数据类型

 

Output:

2-------------------
3-------------------
0 bytes in 0 Free Blocks
0 bytes in 0 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 0 bytes.

c类型的没有构造,且不能对C的malloc/free.GlobalAlloc/GlobalFree或LocalAlloc/LocalFree的检测!

 

    (2).C++类型 string

Output:

2-------------------
3-------------------
0 bytes in 0 Free Blocks
0 bytes in 0 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 0 bytes.

这是STL的事情,STL有一套自己的内存的管理的方法。

 

    (3).对MFC类型 CString

Output:

1-------------------
Dumping objects ->
f:/sp/vctools/vc7libs/ship/atlmfc/src/mfc/strcore.cpp(141) : {147} normal block at 0x003B8CC0, 23 bytes long.
 Data: <, ?x            > 2C 08 3F 78 06 00 00 00 06 00 00 00 01 00 00 00
Object dump complete.

2-------------------
Memory Lack!
3-------------------

0 bytes in 0 Free Blocks.
23 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 23 bytes.
4-------------------

// 没有 Detected memory leaks!

大家可以看到,这是MFC自己的事情,2块内存相比,存在差异,但是并没有提醒Detected memory leaks!

 

 

总结:我们在使用内存检测的时候最好就是检测new 和delete 不要检验其他的数据类型。也可以检测某个函数调用完后内存的使用情况,大家可以自己试一试~哈哈

VC/MFC 内存泄漏的个人总结 首先先看看下面的内容吧! 我就是认真阅读了它,并结合自己所学的东西,解决了一个超难得问题(自己觉得!嘿嘿)关于MFC下检查和消除内存泄露的技巧摘要本文分析了Windows环境使用MFC调试内存泄露的技术,介绍了在Windows环境下用VC++查找,定位和消除内存泄露的方法技巧。关键词:VC++;CRT 调试堆函数;试探法。编译环境VC++6.0技术原理检测内存泄漏的主要工具是调试器和 CR 阅读详情

相关推荐

关于pintos 和bochs 的配置

关于pintos 和bochs 的配置,能够生成一个小型可编辑系统,了解系统的线程运行方式。

CMemoryState使用

确切的说,在C++中对内存的管理是挺复杂的,申请内存的同时也必须记得释放内存,new匹配delete, new[]匹配delete[].还有更困难的是在涉及到组模(Module),这点暂不讨论,等我搞清楚后会和大家分享。现在先说一下CMemoryState,如有什么不足之处,或者是错误的地方,请各位看官不吝赐教,谢谢。 在MFC中,可以使用CMemoryState检测内存泄露,内存的泄露是由于程

sunliangyuan的专栏 2338

pintos project1

pintos project1 源代码,通过全部测试。

jvm调优

什么是调优? 1、根据需求进行jvm规划和预调优 2、优化运行jvm运行环境(慢、卡顿)(怎么才能定位一个系统的瓶颈?压测) 3、解决jvm运行过程中出现的各种问题(Memory Lack OOM) -Xms:最小堆大小 -Xmx: 最大堆大小 -XX:+printGC:在运行之中把垃圾回收器的日志打印出来 注意:-Xms为什么设置-Xmx一样? 防止内存抖动(内存扩容) 分配失败-> 54m->1m(回收了53m)(剩余199m) 回收时间 参数调优 : .

黑冰[̲̅V̲̅I̲̅P̅] 522

内存泄露

1. 什么是内存泄露(memory leak)?  指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。  A memory leak is a particular type of unintentional memory consump

zwb8848happy的专栏 941

CMemoryState使用看内存监测

确切的说,在C++中对内存的管理是挺复杂的,申请内存的同时也必须记得释放内存,new匹配delete, new[]匹配delete[].还有更困难的是 在涉及到组模(Module),这点暂不讨论,等我搞清楚后会和大家分享。现在先说一下CMemoryState,如有什么不足之处,或者是错误的地方, 请各位看官不吝赐教,谢谢。 在MFC中,可以使用CMemoryState检测内存泄露,内存的泄露

ghevinn欢迎您光临 2891

MFC程序内存泄露检查

CMemoryState可以帮助我们检测程序中的内存泄漏,具体定义为: CMemoryState provides a convenient way to detect memory leaks in your program. A “memory leak” occurs when memory for an object is allocated on the heap but not de

szfhy的博客 6410

CMemoryStateMFC内存检测类)(转)

MFC中的CMemoryState 类。  这个类非常有用,它可以给当前内存照个快照,并可以将内存快照进行比对。如果你想确认程序在某个时段中分配的内存全部被正确的释放,那可以在这个时段开始时照个快照,结束后再照一个。如果这个两个快照不一样,说明这个时段中有内存泄漏了。  这个类很容易使用。MSDN上的说明很清楚,还有一个例子。  EMule在Emule.cpp文件中申明了这个类的三个静态变量sta...

weixin_34210740的博客 519

MFC判断内存泄露的简单方法 CmemoryState

MFC提供了检查内存的类CmemoryState,我们就利用这个类的对象来检查内存泄露,以下是具体步骤: 一:在你所检测的程序段的开始处建立一个 CmemoryState 对象,调用其成员函数Checkpoint,以取得当前内存使用情况的快照; 二:在你所检测的程序段的末尾处再建立一个 CmemoryState 对象,调用其成员函数Checkpoint,以取得当前内存使用情况的快照; 三:

rongwenbin的专栏 1587

CMemoryStateMFC内存检测类)

MFC中的CMemoryState 类。  这个类非常有用,它可以给当前内存照个快照,并可以将内存快照进行比对。如果你想确认程序在某个时段中分配的内存全部被正确的释放,那可以在这个时段开始时照个快照,结束后再照一个。如果这个两个快照不一样,说明这个时段中有内存泄漏了。  这个类很容易使用。MSDN上的说明很清楚,还有一个例子。  EMule在Emule.cpp文件中申明了这个...

weixin_34087307的博客 215

终端编码代理:AI如何重塑开发者命令行工作流

在软件开发领域,命令行终端是开发者与操作系统交互的核心界面,承载着脚本编写、系统调试、数据处理等关键任务。其工作原理基于Shell解释器对文本命令的解析与执行,通过管道、重定向等机制组合工具链,实现自动化与高效操作。随着AI技术的演进,智能辅助编程的价值日益凸显,它能够将人类自然语言意图转化为精确的机器指令,显著降低认知负荷与操作门槛。这一技术尤其适用于需要频繁切换上下文、执行探索性任务或处理临时性需求的工程实践场景。例如,在日志分析、复杂命令构造或一次性脚本编写中,开发者常需反复查询文档或拼凑语法,导致工

weixin_34310369的博客 338

应用CMemoryState动态检测内存泄漏

使用MFC开发,当程序退出时,Visual Studio会在输出窗口提供关于内存泄漏信息的提示,但也仅仅是在退出后才给出提示,如果想在运行过程中在输出窗口看到关于当前内存泄漏的信息,就需要借助MFCCMemoryState. 这个类在afx.h头文件中定义在Debug模式下,因此使用这个类也需要在Debug模式下。 CMemoryState类的主要成员函数如下: .Checkpoi...

weixin_30810239的博客 194

PINTOS PROJECT2 自己讲课用的PPT

这是温帅哥自己写的pintos project2的ppt,很详细很彻底。是我讲课用的。转载请注明。如需详情请配合视频使用

pintos斯坦福大学的操作系统课程使用的微操作系统

pintos斯坦福大学的操作系统课程使用的微操作系统

MFC程序内存泄漏检测方法

MFC程序内存泄漏检测方法: 1.在 CMyApp 中添加如下三个 CMemoryState 类的成员变量:  #ifdef _DEBUG protected: CMemoryState m_msOld, m_msNew, m_msDiff; #endif // _DEBUG  2.在 CMyApp::InitInstance() 中添加如下代码: #ifdef _DEBUG

没有根柢盘深,怎有枝叶峻茂 684

处理内存泄漏的一种MFC方法

信息产业部数据所 廖 铮 ---- Windows使用复杂的内存管理器控制和优化内存的使用(包括磁盘缓冲)。一旦内存管理出现纰漏就会导致内存泄漏。内存泄漏的实质一般是因为在堆上分配了某块内存但以后不再对其重新分配,使得该部分内存失去重用性。出现这一问题的多数应用程序一开始往往正常运行,所以要检测出该类问题是较为困难的。不过,要将其找出并得到正确的处理才更麻烦。大多数MFC应用程序允许Windo

488

MFC中高级调试技术

 MFC中高级调试技术1. TRACE宏的利用    TRACE宏有点像我们以前在C语言中用的printf函数,使程序在运行过程中输出一些调试信息,使我们能了解程序的一些状态。但有一点不同的是,TRACE宏只有在调试状态下才有输出,而以前用的Printh函数在任何情况下都有输出。同printf函数一样,TRACE宏可以接受多个参数,如:    int x = 1;    int y

rabbit729的专栏 1374

关于查找内存泄漏

         在多少的内存泄漏中,我都用MFC提供的CMemoryState这个类来查找,屡试不爽呀。不管是再复杂再庞大的项目, 有了它,内存泄漏不再有啦。具体的用法请参照MSDN。         可以参照下面代码(MSDN示例)来编写自己的方法:// Declare the variables needed#ifdef _DEBUG   CMemoryState oldMe

hjy82919的专栏 477
上一篇: VS2005 在编译C++时候遇到的错误和警告
下一篇: Windows下C++多线程同步与互斥简单运用
ccing
博客等级 码龄19年 11粉丝 9原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值