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 目的。

参考技术A 你说的没错~确实需要遍历才能释放完全

你始终要记住一个原则 你自己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

  


一、申请内存的两种方式:

  1. 通过VirtualAlloc/VirtualAllocEx申请的:Private Memory  //底层的实现完全一样
  2. 通过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的释放问题的主要内容,如果未能解决你的问题,请参考以下文章

std::unordered_map 析构函数不释放内存?

通过右值传递给 unordered_map 时释放内存

Java Map释放内存置null以及调用clear()的区别

golang map delete 会释放value吗

c++ 内存管理 —— delete释放内存的时效性

为啥调用 std:map:clear 后内存占用率没有降低