最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析C++ 中std::map內(nèi)存管理

 更新時間:2025年08月19日 11:47:26   作者:點(diǎn)云SLAM  
文章詳解C++ std::map內(nèi)存管理,指出clear()僅刪除元素可能不釋放底層內(nèi)存,建議用swap()與空map交換以徹底釋放,針對指針類型需手動delete,提供模板函數(shù)自動處理不同類型的map內(nèi)存釋放,兼顧普通對象、原始指針及智能指針,避免內(nèi)存泄漏,感興趣的朋友一起看看吧

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() 只是刪除節(jié)點(diǎn),不一定釋放底層內(nèi)存池分配的所有內(nèi)存(STL 可能保留內(nèi)存用于以后復(fù)用)。

2?、使用 swap 徹底釋放內(nèi)存

為了讓 STL 容器釋放所有內(nèi)存,可以和一個空 map 交換:

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

等價于:

std::map<int, std::string> emptyMap;
myMap.swap(emptyMap); // 將 myMap 與空 map 交換
  • 優(yōu)點(diǎn):保證底層內(nèi)存釋放
  • 適合大 map 釋放內(nèi)存,避免內(nèi)存泄漏

3?、map 中存儲指針類型的對象

如果 map 中是指針類型,需要先釋放指針指向的內(nèi)存,否則會泄漏:

#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(); // 刪除節(jié)點(diǎn)
    // 或者徹底釋放內(nèi)存
    std::map<int, std::string*>().swap(myMap);
    std::cout << "Map cleared and memory released" << std::endl;
}

4?、總結(jié)

操作內(nèi)存釋放效果適用場景
myMap.clear()刪除元素,可能不釋放底層節(jié)點(diǎn)內(nèi)存小型 map 或可重復(fù)使用的 map
std::map<…>().swap(myMap)刪除元素,釋放底層內(nèi)存大型 map,徹底釋放內(nèi)存
對指針類型元素手動 delete釋放指針對象占用內(nèi)存map 存儲動態(tài)分配對象

5、擴(kuò)展應(yīng)用示例-模板化函數(shù)free_map_memory內(nèi)存釋放

下面是一個 模板化函數(shù) free_map_memory,能自動處理 指針和非指針類型 map 的完全釋放,被封裝成可復(fù)用工具函數(shù),可以直接應(yīng)用到開發(fā)項目中,大家可根據(jù)自己的需求進(jìn)行更改。

示例1,常規(guī)版本

#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();
    // 徹底釋放底層內(nèi)存
    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;
}

功能特點(diǎn)

  1. 自動識別值類型是否為指針:使用 std::is_pointer_v。
  2. 安全釋放指針類型對象:自動 delete
  3. 徹底釋放 map 內(nèi)存:使用 swap 與臨時空 map 交換。
  4. 通用:支持任何 std::map<Key, Value> 類型,包括自定義結(jié)構(gòu)體指針。

示例2,智能指針版本

加強(qiáng)版本能自動識別并處理以下幾類 map

  1. 值類型為普通對象
  2. 值類型為原始指針
  3. 值類型為 std::unique_ptrstd::shared_ptr

模板函數(shù)會自動釋放內(nèi)容并徹底回收 map 內(nèi)存。

#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();
    // 徹底釋放底層內(nèi)存
    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;
}

功能特點(diǎn)

  1. 自動區(qū)分普通對象 / 原始指針 / 智能指針
  2. 原始指針自動 delete
  3. 智能指針無需手動釋放
  4. 徹底回收 map 內(nèi)存,避免底層內(nèi)存占用

到此這篇關(guān)于C++ 中std::map內(nèi)存管理詳解的文章就介紹到這了,更多相關(guān)C++ td::map內(nèi)存管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT中QChart繪制折線圖

    QT中QChart繪制折線圖

    本文主要介紹了QChart繪制折線圖,Qt Charts基于Qt的Graphics View架構(gòu),其核心組件是QChartView 和 QChart,感興趣的可以了解一下
    2022-04-04
  • c語言:金幣陣列的問題

    c語言:金幣陣列的問題

    本文介紹了關(guān)于c語言:金幣陣列的問題,需要的朋友可以參考一下
    2013-03-03
  • C語言算法積累分離數(shù)位示例

    C語言算法積累分離數(shù)位示例

    這篇文章主要為大家介紹了C語言算法積累分離數(shù)位的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • C語言鄰接表建立圖詳解

    C語言鄰接表建立圖詳解

    這篇文章主要介紹了C語言鄰接表建立圖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳談C++ socket網(wǎng)絡(luò)編程實例(2)

    詳談C++ socket網(wǎng)絡(luò)編程實例(2)

    這篇文章主要為大家介紹了C++ socket網(wǎng)絡(luò)編程實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++實現(xiàn)String與UF8互轉(zhuǎn)

    C++實現(xiàn)String與UF8互轉(zhuǎn)

    這篇文章介紹了C++實現(xiàn)String與UF8互轉(zhuǎn)的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C++中std::chrono時間庫的全面解析

    C++中std::chrono時間庫的全面解析

    C++?std::chrono時間庫是C++標(biāo)準(zhǔn)庫提供的一個時間處理庫,提供了一個方便、靈活和精確的時間處理工具,下面小編就帶大家深入了解一下std::chrono時間庫的使用吧
    2023-10-10
  • Visual?Studio2022配置ReSharper?C++?常用設(shè)置方法

    Visual?Studio2022配置ReSharper?C++?常用設(shè)置方法

    這篇文章主要介紹了Visual?Studio2022配置ReSharper?C++?常用設(shè)置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),文中介紹了卸載Resharper的方法及Resharper激活碼,感興趣的朋友參考下吧
    2024-01-01
  • C++實現(xiàn)LeetCode(110.平衡二叉樹)

    C++實現(xiàn)LeetCode(110.平衡二叉樹)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(110.平衡二叉樹),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++?STL之string的模擬實現(xiàn)實例代碼

    C++?STL之string的模擬實現(xiàn)實例代碼

    C++中有命名空間的存在,我們只需把我們的代碼封到自定義的命名空間即可,下面這篇文章主要給大家介紹了關(guān)于C++?STL之string的模擬實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評論

万年县| 苗栗县| 曲松县| 肃北| 蒙山县| 关岭| 高尔夫| 徐州市| 崇仁县| 二连浩特市| 十堰市| 图们市| 锡林郭勒盟| 青岛市| 东源县| 铜鼓县| 孟津县| 长宁区| 乐东| 崇州市| 新乡市| 河间市| 织金县| 林州市| 乌拉特后旗| 万荣县| 汶川县| 大安市| 苍梧县| 平定县| 汨罗市| 道真| 阳高县| 河南省| 岚皋县| 鹤壁市| 墨脱县| 武川县| 神农架林区| 沁源县| 绥滨县|