CMAP是否可以使用RemoveAll()释放内存?CMAP如何释放内存?
是否可以使用RemoveAll释放内存?CMAP如何释放内存?
- 1、映射表类(CMap)
- 2、CMap的格式:
- 3、CMAP头文件
- 4、CMAP是否可以使用RemoveAll()释放内存?
- 5、RemoveAll()为何没有释放内存?
- 6、CMAP如何释放内存?
1、映射表类(CMap)
CMap是MFC集合类中的一个模板类,也称作为“字典”,就像一种只有两列的表格,一列是关键字,一列是数据项,它们是一一对应的。
2、CMap的格式:
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap : public CObject
- Key:用作Key的类型(比如整型、浮点型等)
- ARG_KEY:Key的值
- VALUE: 用作VALUE的类型
- ARG_VALUE:用作VALUE的值
3、CMAP头文件
#include<afxtempl.h>
4、CMAP是否可以使用RemoveAll()释放内存?
- 先说答案:不可以
- 验证方案:
我们用两个指针(ob、junxue)指向同一块内存,用CMAP(含有一个指针ob)调用RemoveAll()函数,用另外一个指针(junxue)访问内存数据。
用指针junxue访问数据成功,说明RemoveAll()没有释放内存;
用指针junxue访问数据失败,说明RemoveAll()函数释放内存; - 验证demo
#include "stdafx.h"
#include<afxtempl.h>
#include <iostream>
using namespace std;
typedef struct
{int number;bool sex;char name[220];
}student;
int main(){student *junxue;CMap<int,int,student*,student*> m_map;for(int i=0; i<5; i++){ student *ob=new student();ob->number=i;ob->sex= bool(i%2);strcpy_s(ob->name,"zhengjunxue");m_map.SetAt(i,ob);junxue=ob;}m_map.RemoveAll(); cout<<junxue->name<<endl;return 0;
}
- 输出
zhengjunxue
- 结论:RemoveAll()没有释放内存.
5、RemoveAll()为何没有释放内存?
查看RemoveAll()源码可知,其只是置为NULL,并没有delete;
void CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::RemoveAll()
{ASSERT_VALID(this);if (m_pHashTable != NULL){// destroy elements (values and keys)for (UINT nHash = 0; nHash < m_nHashTableSize; nHash++){CAssoc* pAssoc;for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL;pAssoc = pAssoc->pNext){pAssoc->CAssoc::~CAssoc();//DestructElements<VALUE>(&pAssoc->value, 1);//DestructElements<KEY>((KEY*)&pAssoc->key, 1);}}}// free hash tabledelete[] m_pHashTable;m_pHashTable = NULL;m_nCount = 0;m_pFreeList = NULL;m_pBlocks->FreeDataChain();m_pBlocks = NULL;
}
6、CMAP如何释放内存?
#include "stdafx.h"
#include<afxtempl.h>
#include <iostream>
using namespace std;
typedef struct
{int number;bool sex;char name[220];
}student;int main(){//char name[210];//strcpy_s(name,"zhengjunxue");//for(int i=0;i<5;i++)//{// cout<<name[i]<<endl;//}student *junxue;CMap<int,int,student*,student*> m_map;for(int i=0; i<5; i++){ student *ob=new student();ob->number=i;ob->sex= bool(i%2);strcpy_s(ob->name,"zhengjunxue");m_map.SetAt(i,ob);junxue=ob;}//m_map.RemoveAll(); int i;student *ob;POSITION pos = m_map.GetStartPosition();while(pos!=NULL){ m_map.GetNextAssoc(pos,i,ob);if (ob != NULL){delete ob;ob =NULL;}}m_map.RemoveAll(); //这个是需要的,调试了下RemoveAll()函数。当执行两次时,第二次执行的过程不一样。cout<<junxue->name<<endl;return 0;
}
输出
闇s
参考:
1、MFC中CMAP对象的创建与释放,防止内存泄漏
2、CMap类的使用
3、Cmap的使用
4、CMap的使用
CMAP是否可以使用RemoveAll()释放内存?CMAP如何释放内存?相关推荐
- 关于内存管理-提前释放的问题
最近接受了一个项目,代码构造是很好的,但是还是使用mrc的管理方法,这次又算让我学习了一次内存管理,遇到内存释放crash的问题,搜了一篇文章,不妨使用下面的方法,可以有一个很好地定位. 在XCode ...
- python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...
17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...
- .net调用c++方法时如何释放c++中分配的内存_C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...
一.C语言程序的构成 与C++.Java相比,C语言其实很简单,但却非常重要.因为它是C++.Java的基础.不把C语言基础打扎实,很难成为程序员高手. 1.C语言的结构 先通过一个简单的例子,把C语 ...
- C语言内存动态分配与释放
一.内存分配 对于内存的分配,主要采用的是标记法. 分配方法有两种,一种是静态分配,也就是在程序编译的时候,就完成了对内存的分配.例如当一个数组在声明时,指定长度之后,它所需要的内存在编译时就会被分配 ...
- 内存动态分配与释放,malloc和new区别
1. C语言的函数malloc和free (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数 void * malloc(size_t size) 动态配置内 ...
- C/C++内存申请和释放(一)
这一篇主要介绍一下C中的malloc和free(当然在C++中它们也可以使用),下一篇将主要介绍一下C++中的new和delete 如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢 0. mallo ...
- Python内存管理及释放
python话说会自己管理内存,实际上,对于占用很大内存的对象,并不会马上释放.举例,a=range(10000*10000),会发现内存飙升一个多G,del a 或者a=[]都不能将内存降下来.. ...
- C/C++动态二维数组的内存分配和释放
C语言: 1 //二维数组动态数组分配和释放 2 //数组指针的内存分配和释放 3 //方法一 4 char (*a)[N];//指向数组的指针 5 a = (char (*)[N])malloc(s ...
- 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...
最新文章
- ubuntu 安装RPM软件包
- Linux下shel脚本之批量修改文件扩展名
- 路由器简介与IOS介绍
- 【学习笔记】多项式相关算法
- mac笔记本修改 mysql 的密码
- 计算机网络的非性能特征PPT,计算机网络概述课件课件.ppt
- [每天一个知识点]31-乱七八糟-如何判断预言有效
- 机器学习、⼈⼯智能、深度学习是什么关系?
- 沙盘推演具体包括哪些内容
- source 还原数据库
- 【转】对程序中常出现的EINT、DINT、ERTM、DRTM的理解
- QQ自定义表情巧收藏换了电脑照样用(转)
- 当我开始学微信公众号开发时,我要学什么?
- 〖Python自动化办公篇①〗- 文件自动化管理引言及shutil模块实现文件与文件内容的复制
- 南方周末:股神炒股一周年祭 24万本金仅剩7千
- 嵩天老师python123测验7: 文件和数据格式化 (第7周)
- 大型互联网架构与集群技术
- drupal 的简单模板修改
- dubbo分布式框架
- pythonpptx库_python-pptx安装
热门文章
- c语言中,从键盘输入一个长方体的长宽高,用函数实现求长方体的体积,由主函数调用该函数,要求长方体的长、宽、高从主函数输入,长方体的体积作为函数返回值。
- 二代旅游CMS网站管理系统使用手册(三)--计调线路团期录入
- 这才是图扑数字孪生污水处理厂该有的样子
- 软件工程——软件总体设计
- php的lumen框架,Lumen框架“服务容器”源码解析
- 笔记-Codeforces比赛
- Python之input()函数用法,如何接收单行或多行的输入多个参数
- 嵌入式驱动方面,这篇文章讲绝了!
- C语言简单程序——解二元一次方程
- 重邮计算机学院新闻,感知重邮丨重庆邮电大学计算机学院稳固学科建设核心 提升人才培养质量...