国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ map clear內(nèi)存泄漏問題

這篇具有很好參考價(jià)值的文章主要介紹了C++ map clear內(nèi)存泄漏問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

map值存的是指針

map自帶的clear()函數(shù)會清空map里存儲的所有內(nèi)容,但如果map值存儲的是指針,則里面的值不會被清空,會造成內(nèi)存泄漏,所以值為指針的map必須用迭代器清空。

使用erase迭代刪除
迭代器刪除值為指針的map,一定要注意迭代器使用正確,一旦迭代器失效程序就會崩潰。

std::map<int, HHH*> test_map;
HHH* h1 = new HHH;
HHH* h2 = new HHH;
test_map[0] = h1;
test_map[1] = h2;


// 刪除
std::map<int, HHH*>::iterator iter;
for (iter = test_map.begin(); iter != test_map.end();)
{
    delete iter->second;
    iter->second = nullptr;
    // 刪除迭代器元素先加加再刪,否則迭代器失效程序崩潰?。?!(必須iter++不可以++iter)
    test_map.erase(iter++);
}

map值存儲的不是指針

std::map<int,int> test_map;
test_map[0] = 0;
test_map[1] = 0;

// 刪除
test_map.clear(); //值為指針不要這樣刪除

調(diào)用clear()函數(shù)之前先把值里的指針的值通過迭代器delete

	std::map<int, HHH*> test_map;
    HHH* h1 = new HHH;
    HHH* h2 = new HHH;
    test_map[0] = h1;
    test_map[1] = h2;

    // 刪除
    std::map<int, HHH*>::iterator iter;
    for (iter = test_map.begin(); iter != test_map.end();)
    {
        delete iter->second;
        iter->second = nullptr;
        // 刪除迭代器元素先加加再刪,否則迭代器失效程序崩潰?。?!(必須iter++不可以++iter)
        iter++;
    }
    test_map.clear();

map中存儲的是智能指針

若是采用了智能指針,則無需單獨(dú)delete,智能指針,會自動釋放內(nèi)存

std::map<int, std::shared_ptr<int>> m_map;
m_map[0] = std::make_shared<int>();
delete m_map[0]; //錯誤

清空map釋放內(nèi)存

若需要多次使用同一個(gè)map,其中每次使用后都clear清空,多次之后,可能出現(xiàn)內(nèi)存泄露,這是因?yàn)閙ap的空間便沒有釋放,所以得使用swap清空。

如果內(nèi)存錯誤提示如下

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000010ca227 in tcmalloc::SLL_Next(void*) ()
(gdb) bt
#0  0x00000000010ca227 in tcmalloc::SLL_Next(void*) ()
#1  0x00000000010ca2b8 in tcmalloc::SLL_TryPop(void**, void**) ()
#2  0x00000000010ca715 in tcmalloc::ThreadCache::FreeList::TryPop(void**) ()
#3  0x00000000011ebe6c in tc_newarray ()

STL容器調(diào)用clear()方法,通常只是使得容器內(nèi)部的對象通通析構(gòu),但容器本身的內(nèi)存無法得到釋放。即籃子里面東西拿走了,籃子占的空間還在,這樣是為了方便下次存放新的對象時(shí),不需要再次申請空間。即clear()后,容器的size為0,但capacity不變。通過swap()空容器,來徹底釋放容器占用的capacity。

#include<map>
#include<vector>
#include<string>
#include <iostream>
#include <time.h>
using namespace std;
 
class useTest
{
public:
    useTest() {};
    map<string,string> testMap;
    vector<string> testVertor;
    string id;
};
 
void clearData(map<int, useTest>& needClearMap)
{
    clock_t  startt = clock();
 
    //分別通過去注釋測試下面四種情況
 
    //使用clear
    //needClearMap.clear();
 
    //使用swap
    map<int, useTest> uu;
    needClearMap.swap(uu);
 
    //使用erase
    //needClearMap.erase(needClearMap.begin(), needClearMap.end());
 
    //使用for erase
    //for (auto iter = needClearMap.begin(); iter != needClearMap.end(); iter = needClearMap.erase(iter)) {}
    double sec = double(clock() - startt) / CLOCKS_PER_SEC;
    std::cout << "In Clear Cost Time:" << sec << endl;
}
 
void test()
{
    map<int, useTest> needClearMap;
    for (size_t i = 0; i <= 10000; ++i)
    {
        useTest uT;
        for (size_t ii = 0; ii <= 1000; ++ii)
        {
            uT.testMap[to_string(ii)] = "我是測試,我是測試,我就是測試string";
            uT.testVertor.push_back("我也是測試,我也是測試,我就是測試string");
        }
        uT.id = to_string(i);
        //cout << i << endl;
        needClearMap[i] = uT;
    }
    clock_t  startt = clock();
    clearData(needClearMap);
    double sec = double(clock() - startt) / CLOCKS_PER_SEC;
    std::cout << "clearData Cost Time:" << sec << endl;
}
 
int main()
{
    for (size_t i = 0; i < 10; ++i)
    {
        test();
    }
    getchar();
}

就單單實(shí)現(xiàn)某個(gè)map清空來說,swap效率最高,幾乎是0耗時(shí)。但是當(dāng)退出整個(gè)函數(shù),釋放swap轉(zhuǎn)移到的臨時(shí)對象要耗一定的時(shí)間。erase效率稍微比clear高。通過for循環(huán)erase好似效率又高點(diǎn)。

對于map、set、unordered_map等容器,調(diào)用clear()、swap()都無法使得內(nèi)存真正釋放。雖然很多地方談到,這一現(xiàn)象(內(nèi)存被保留下來)是正常的,并不需要擔(dān)心。但是當(dāng)大量使用堆內(nèi)存存放不同的數(shù)據(jù)結(jié)構(gòu),會造成嚴(yán)重的內(nèi)存碎片從而導(dǎo)致內(nèi)存泄漏問題。

#include <iostream>
#include <map>
#include <malloc.h>
using namespace std;
void func()
{
        map<int,string> mp;
        int i = 5000000;
        while(i--)
            mp.insert(make_pair(i,string("hell000o")));
        map<int,string>().swap(mp); //swap
}
int main()
{
        func();
        cout <<"done."<<endl;
        malloc_trim(0);
        while(1);
}
 

只需添加一行,malloc_trim(0); 這一行代碼會將空閑的堆內(nèi)存歸還給操作系統(tǒng),供其他進(jìn)程使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-700745.html

到了這里,關(guān)于C++ map clear內(nèi)存泄漏問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用Map.clear()、List.clear()方法,清空時(shí)注意!

    對 Map、List 對象進(jìn)行清空操作時(shí),常常會使用 clear() 方法。 例如,清空 Map 換做 List 也是同樣的用法 本文想要說的是,需要注意,如果使用clear()方法, Map被清空的同時(shí),原本對Map的引用會一起被清空!??! 代碼舉例: 這段代碼也很簡單,兩層循環(huán)。 最里層向 listTemp 中添加

    2024年01月20日
    瀏覽(19)
  • 【Go】常見的四個(gè)內(nèi)存泄漏問題

    1、這里更多的是由于channel+for+select導(dǎo)致的,錯誤的寫法導(dǎo)致了發(fā)送者或接收者沒有發(fā)現(xiàn)channel已經(jīng)關(guān)閉,任務(wù)已經(jīng)結(jié)束了,卻仍然在嘗試輸入輸出https://geektutu.com/post/hpg-exit-goroutine.html 不要把map用作全局

    2024年02月13日
    瀏覽(28)
  • 使用asan檢測內(nèi)存泄漏、堆棧溢出等問題

    操作過程參考:鏈接 緣起:程序在移動端崩潰,mac端復(fù)現(xiàn)不了,于是在寫個(gè)崩潰位置函數(shù)的調(diào)用demo,使用ASAN工具進(jìn)行排查。 驗(yàn)證過程 1、代碼 main.cpp 使用附加ASAN工具的方式進(jìn)行編譯: 執(zhí)行: 沒有問題,以上是驗(yàn)證過程,如有問題執(zhí)行時(shí)ASAN會提示有問題的相關(guān)位置。 介紹

    2024年02月11日
    瀏覽(28)
  • [JAVA]websocket引起的內(nèi)存泄漏問題排查

    [JAVA]websocket引起的內(nèi)存泄漏問題排查

    項(xiàng)目運(yùn)行一天后出現(xiàn)了 java.lang.OutOfMemoryError: GC overhead limit exceeded 的錯誤,造成系統(tǒng)宕機(jī)。這說明給JVM分配的內(nèi)存已經(jīng)耗盡,不足以支撐垃圾回收進(jìn)行內(nèi)存回收工作,意味著程序占用的內(nèi)存隨著時(shí)間大小提升,最終耗盡。 2.1 宏觀分析 從字面意思來看,GC(garbage collection)所需

    2024年02月13日
    瀏覽(27)
  • ()自定義DialogFragment以及解決其內(nèi)存泄漏問題

    ()自定義DialogFragment以及解決其內(nèi)存泄漏問題

    日常開發(fā)中,dialog是常見的功能,我們時(shí)常需要彈出來一些彈框提示用戶 今天就定義了一個(gè)方便的dialog基類BaseSimpleDialogFragment, 支持快速地顯示一個(gè)dialog 主要功能有: initAnimation:設(shè)置入場和出場動畫 getGravity:設(shè)置dialog顯示位置(屏幕上,中,下) getCanceledOnTouchOutside:點(diǎn)

    2024年02月15日
    瀏覽(23)
  • 使用Visual Leak Detector排查內(nèi)存泄漏問題

    目錄 1、VLD工具概述 2、下載、安裝VLD 2.1、下載VLD 2.2、安裝VLD 3、VLD安裝目錄及文件說明

    2024年02月07日
    瀏覽(34)
  • 【Android】一個(gè)contentResolver引起的內(nèi)存泄漏問題分析

    長時(shí)間的壓力測試后,系統(tǒng)發(fā)生了重啟,報(bào)錯log如下 JNI ERROR (app bug): global reference table overflow (max=51200) global reference table overflow的log 08-08 04:11:53.052912 ??973 ?3243 F zygote64: indirect_reference_table.cc:256] JNI ERROR (app bug): global reference table overflow (max=51200) 08-08 04:11:53.053014 ??973 ?3243 F z

    2024年02月08日
    瀏覽(25)
  • 前端面試寶典~Symbol、相同的Set、Getter、控制動畫、js中哪些操作會造成內(nèi)存泄漏?等......

    前端面試寶典~Symbol、相同的Set、Getter、控制動畫、js中哪些操作會造成內(nèi)存泄漏?等......

    html頁面的骨架,相當(dāng)于人的骨頭,只有骨頭是不是看著有點(diǎn)瘆人,只有HTML也是如此。 css,相當(dāng)于把骨架修飾起來,相當(dāng)于人的皮肉。 js(javascripts),動起來,相當(dāng)于人的血液,大腦等一切能使人動起來的器官或者其他的。 在刷題之前先介紹一下???。Leetcode有的刷題??投加?,

    2024年01月20日
    瀏覽(25)
  • 【C++】深入探討內(nèi)存管理:malloc/free與new/delete的區(qū)別以及如何避免內(nèi)存泄漏

    在軟件開發(fā)中,正確處理內(nèi)存管理是至關(guān)重要的一環(huán)。在C++編程中,我們經(jīng)常會用到動態(tài)內(nèi)存管理的工具,比如 malloc/free 和 new/delete 。本文將深入探討 malloc/free 與 new/delete 之間的區(qū)別,以及如何有效地避免內(nèi)存泄漏問題。 都是用于從堆上申請空間,并需要手動釋放。 mallo

    2024年02月22日
    瀏覽(21)
  • 利用谷歌DevTool解決web網(wǎng)頁內(nèi)存泄漏問題

    利用谷歌DevTool解決web網(wǎng)頁內(nèi)存泄漏問題

    目錄 web網(wǎng)頁內(nèi)存泄漏 主要的內(nèi)存泄漏來源 利用谷歌DevTool定位內(nèi)存泄漏問題 性能Performance 主要功能 Performance insights性能數(shù)據(jù)分析 Memory內(nèi)存 三種模式 相關(guān)概念 解決內(nèi)存泄漏問題 第一步 :是否內(nèi)存泄漏:js堆直增不降;降的不多 第二步:找到導(dǎo)致內(nèi)存泄漏的函數(shù)或者變量,

    2024年02月08日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包