当前位置: 代码网 > it编程>编程语言>C/C++ > 深入解析C++ 中std::map内存管理

深入解析C++ 中std::map内存管理

2025年08月19日 C/C++ 我要评论
1️、基本清空std::map使用 clear() 可以删除 map 中的所有元素,销毁每个元素:#include <iostream>#include <map>int ma

1️、基本清空std::map

使用 clear() 可以删除 map 中的所有元素,销毁每个元素:

#include <iostream>
#include <map>
int main() {
    std::map<int, std::string> mymap;
    mymap[1] = "one";
    mymap[2] = "two";
    std::cout << "before clear, size: " << mymap.size() << std::endl;
    // 清空 map
    mymap.clear();
    std::cout << "after clear, size: " << mymap.size() << std::endl;
    return 0;
}

输出:

before clear, size: 2
after clear, size: 0

注意:clear() 只是删除节点,不一定释放底层内存池分配的所有内存(stl 可能保留内存用于以后复用)。

2️、使用 swap 彻底释放内存

为了让 stl 容器释放所有内存,可以和一个空 map 交换:

std::map<int, std::string>().swap(mymap);

等价于:

std::map<int, std::string> emptymap;
mymap.swap(emptymap); // 将 mymap 与空 map 交换
  • 优点:保证底层内存释放
  • 适合大 map 释放内存,避免内存泄漏

3️、map 中存储指针类型的对象

如果 map 中是指针类型,需要先释放指针指向的内存,否则会泄漏:

#include <map>
#include <string>
#include <iostream>
int main() {
    std::map<int, std::string*> mymap;
    mymap[1] = new std::string("one");
    mymap[2] = new std::string("two");
    // 手动释放指针
    for (auto& pair : mymap) {
        delete pair.second;
    }
    mymap.clear(); // 删除节点
    // 或者彻底释放内存
    std::map<int, std::string*>().swap(mymap);
    std::cout << "map cleared and memory released" << std::endl;
}

4️、总结

操作内存释放效果适用场景
mymap.clear()删除元素,可能不释放底层节点内存小型 map 或可重复使用的 map
std::map<…>().swap(mymap)删除元素,释放底层内存大型 map,彻底释放内存
对指针类型元素手动 delete释放指针对象占用内存map 存储动态分配对象

5、扩展应用示例-模板化函数free_map_memory内存释放

下面是一个 模板化函数 free_map_memory,能自动处理 指针和非指针类型 map 的完全释放,被封装成可复用工具函数,可以直接应用到开发项目中,大家可根据自己的需求进行更改。

示例1,常规版本

#include <map>
#include <type_traits>
#include <memory>  // std::addressof
#include <utility> // std::swap
#include <iostream>
template <typename maptype>
void free_map_memory(maptype& m) {
    using valuetype = typename maptype::mapped_type;
    // 如果 valuetype 是指针类型,先 delete 指针
    if constexpr (std::is_pointer_v<valuetype>) {
        for (auto& kv : m) {
            delete kv.second;
        }
    }
    // 清空 map 元素
    m.clear();
    // 彻底释放底层内存
    maptype().swap(m);
}
// ------------------- 示例 -------------------
struct mydata {
    int x;
    mydata(int v) : x(v) {}
};
int main() {
    std::map<int, int> normalmap;
    normalmap[1] = 100;
    normalmap[2] = 200;
    std::map<int, mydata*> pointermap;
    pointermap[1] = new mydata(10);
    pointermap[2] = new mydata(20);
    std::cout << "before free, normalmap size: " << normalmap.size() << std::endl;
    std::cout << "before free, pointermap size: " << pointermap.size() << std::endl;
    free_map_memory(normalmap);
    free_map_memory(pointermap);
    std::cout << "after free, normalmap size: " << normalmap.size() << std::endl;
    std::cout << "after free, pointermap size: " << pointermap.size() << std::endl;
    return 0;
}

功能特点

  1. 自动识别值类型是否为指针:使用 std::is_pointer_v
  2. 安全释放指针类型对象:自动 delete
  3. 彻底释放 map 内存:使用 swap 与临时空 map 交换。
  4. 通用:支持任何 std::map<key, value> 类型,包括自定义结构体指针。

示例2,智能指针版本

加强版本能自动识别并处理以下几类 map

  1. 值类型为普通对象
  2. 值类型为原始指针
  3. 值类型为 std::unique_ptrstd::shared_ptr

模板函数会自动释放内容并彻底回收 map 内存。

#include <map>
#include <memory>
#include <type_traits>
#include <utility>
#include <iostream>
template <typename maptype>
void free_map_memory(maptype& m) {
    using valuetype = typename maptype::mapped_type;
    // 原始指针类型
    if constexpr (std::is_pointer_v<valuetype>) {
        for (auto& kv : m) {
            delete kv.second;
        }
    }
    // unique_ptr 或 shared_ptr 类型
    else if constexpr (std::is_same_v<valuetype, std::unique_ptr<typename valuetype::element_type>> ||
                       std::is_same_v<valuetype, std::shared_ptr<typename valuetype::element_type>>) {
        // 智能指针自动释放,无需手动 delete
    }
    // 普通对象类型,无需特殊处理
    // 清空 map 元素
    m.clear();
    // 彻底释放底层内存
    maptype().swap(m);
}
// ------------------- 示例 -------------------
struct mydata {
    int x;
    mydata(int v) : x(v) {}
};
int main() {
    // 普通对象 map
    std::map<int, int> normalmap{{1,100},{2,200}};
    // 原始指针 map
    std::map<int, mydata*> pointermap;
    pointermap[1] = new mydata(10);
    pointermap[2] = new mydata(20);
    // unique_ptr map
    std::map<int, std::unique_ptr<mydata>> uniqueptrmap;
    uniqueptrmap[1] = std::make_unique<mydata>(30);
    uniqueptrmap[2] = std::make_unique<mydata>(40);
    // shared_ptr map
    std::map<int, std::shared_ptr<mydata>> sharedptrmap;
    sharedptrmap[1] = std::make_shared<mydata>(50);
    sharedptrmap[2] = std::make_shared<mydata>(60);
    free_map_memory(normalmap);
    free_map_memory(pointermap);
    free_map_memory(uniqueptrmap);
    free_map_memory(sharedptrmap);
    std::cout << "all maps freed successfully." << std::endl;
    return 0;
}

功能特点

  1. 自动区分普通对象 / 原始指针 / 智能指针
  2. 原始指针自动 delete
  3. 智能指针无需手动释放
  4. 彻底回收 map 内存,避免底层内存占用

到此这篇关于c++ 中std::map内存管理详解的文章就介绍到这了,更多相关c++ td::map内存管理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com