map的释放问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了map的释放问题相关的知识,希望对你有一定的参考价值。
我定义了一个map <CString, CMateLoader *> m_MateList,
添加数据m_MateList[szKeyName] = new CMateLoader(strBuf);
然后运行就会产生内存泄漏。要这样改呢?
是要delete m_MateList[szKeyName]吗?
我不知道szKeyName的取值,要这样才能通过遍历来delete所有的m_MateList中的值呢?
谢谢Neyes!我也试过了,可是CMateLoader 是一个自定义的类型,不用指针没有办法呀。
我现在就是想知道这样通过遍历来达到delete所有new 的 CMateLoader 目的。
你始终要记住一个原则 你自己new的东西,必然是你自己去delete,也就是谁生成谁释放。
既然你是这样m_MateList[szKeyName] = new CMateLoader(strBuf);
所以你必须这样delete m_MateList[szKeyName];
你可以简单的改成map <CString, CMateLoader>这样就行了,在map里面不保存对象的指针,而直接保存对象,这样你就不用去管空间的问题了
你所说的“CMateLoader 是一个自定义的类型,不用指针没有办法呀。”是不成立的,自定义类型也可以,请仔细检查你的代码吧,不要错怪了“自定类型”
遍历很简单,使用迭代器
map<CString, CMateLoader *>::iterator it;
for(it= m_MateList.begin();it!=m_MateList.end();it++)
//it 就是map中的对象,你要取出it中的第二个元素然后delete就可以了,具体代码我就不写了
本回答被提问者采纳
私有内存的申请与释放
1.私有内存指的是物理页自己用,无法共享
2.同样一块内存被多个进程共享时,则为共享内存Map
一、申请内存的两种方式:
- 通过VirtualAlloc/VirtualAllocEx申请的:Private Memory //底层的实现完全一样
- 通过CreateFileMapping映射的:Mapped Memory
二、内存的申请与释放:
LPVOID VirtualAlloc
LPVOID lpAddress, // 要分配的内存区域的地址
DWORD dwSize, // 分配的大小
DWORD flAllocationType, // 分配的类型
DWORD flProtect // 该内存的初始保护属性
;
BOOL VirtualFree(
LPVOID lpAddress, // 区域地址
SIZE_T dwSize, // 区域大小,字节
DWORD dwFreeType // 类型);
// 私有内存申请.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> int main() LPVOID P = VirtualAlloc( NULL, // 要分配的内存区域的地址 0x1000 * 2, // 分配的大小 MEM_COMMIT, // 分配的类型 MEM_COMMIT占住并分配物理页 PAGE_READWRITE // 该内存的初始保护属性 可读可写 ); //释放申请的内存 VirtualFree(P, 0x1000 * 2, MEM_DECOMMIT); //VirtualFree(P, 0, MEM_RELEASE);//彻底释放
new的本质就是malloc;但是他们不是真正申请内存,只是从已有内存中,再申请一小块自己用(堆内存)
//malloc -》 HeapAlloc -》 没有进内核
以上是关于map的释放问题的主要内容,如果未能解决你的问题,请参考以下文章