是否可以使用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如何释放内存?相关推荐

  1. 关于内存管理-提前释放的问题

    最近接受了一个项目,代码构造是很好的,但是还是使用mrc的管理方法,这次又算让我学习了一次内存管理,遇到内存释放crash的问题,搜了一篇文章,不妨使用下面的方法,可以有一个很好地定位. 在XCode ...

  2. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...

    17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...

  3. .net调用c++方法时如何释放c++中分配的内存_C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...

    一.C语言程序的构成 与C++.Java相比,C语言其实很简单,但却非常重要.因为它是C++.Java的基础.不把C语言基础打扎实,很难成为程序员高手. 1.C语言的结构 先通过一个简单的例子,把C语 ...

  4. C语言内存动态分配与释放

    一.内存分配 对于内存的分配,主要采用的是标记法. 分配方法有两种,一种是静态分配,也就是在程序编译的时候,就完成了对内存的分配.例如当一个数组在声明时,指定长度之后,它所需要的内存在编译时就会被分配 ...

  5. 内存动态分配与释放,malloc和new区别

    1.   C语言的函数malloc和free (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数 void * malloc(size_t size) 动态配置内 ...

  6. C/C++内存申请和释放(一)

    这一篇主要介绍一下C中的malloc和free(当然在C++中它们也可以使用),下一篇将主要介绍一下C++中的new和delete 如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢 0. mallo ...

  7. Python内存管理及释放

    python话说会自己管理内存,实际上,对于占用很大内存的对象,并不会马上释放.举例,a=range(10000*10000),会发现内存飙升一个多G,del a 或者a=[]都不能将内存降下来.. ...

  8. C/C++动态二维数组的内存分配和释放

    C语言: 1 //二维数组动态数组分配和释放 2 //数组指针的内存分配和释放 3 //方法一 4 char (*a)[N];//指向数组的指针 5 a = (char (*)[N])malloc(s ...

  9. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

最新文章

  1. ubuntu 安装RPM软件包
  2. Linux下shel脚本之批量修改文件扩展名
  3. 路由器简介与IOS介绍
  4. 【学习笔记】多项式相关算法
  5. mac笔记本修改 mysql 的密码
  6. 计算机网络的非性能特征PPT,计算机网络概述课件课件.ppt
  7. [每天一个知识点]31-乱七八糟-如何判断预言有效
  8. 机器学习、⼈⼯智能、深度学习是什么关系?
  9. 沙盘推演具体包括哪些内容
  10. source 还原数据库
  11. 【转】对程序中常出现的EINT、DINT、ERTM、DRTM的理解
  12. QQ自定义表情巧收藏换了电脑照样用(转)
  13. 当我开始学微信公众号开发时,我要学什么?
  14. 〖Python自动化办公篇①〗- 文件自动化管理引言及shutil模块实现文件与文件内容的复制
  15. 南方周末:股神炒股一周年祭 24万本金仅剩7千
  16. 嵩天老师python123测验7: 文件和数据格式化 (第7周)
  17. 大型互联网架构与集群技术
  18. drupal 的简单模板修改
  19. dubbo分布式框架
  20. pythonpptx库_python-pptx安装

热门文章

  1. c语言中,从键盘输入一个长方体的长宽高,用函数实现求长方体的体积,由主函数调用该函数,要求长方体的长、宽、高从主函数输入,长方体的体积作为函数返回值。
  2. 二代旅游CMS网站管理系统使用手册(三)--计调线路团期录入
  3. 这才是图扑数字孪生污水处理厂该有的样子
  4. 软件工程——软件总体设计
  5. php的lumen框架,Lumen框架“服务容器”源码解析
  6. 笔记-Codeforces比赛
  7. Python之input()函数用法,如何接收单行或多行的输入多个参数
  8. 嵌入式驱动方面,这篇文章讲绝了!
  9. C语言简单程序——解二元一次方程
  10. 重邮计算机学院新闻,感知重邮丨重庆邮电大学计算机学院稳固学科建设核心 提升人才培养质量...