亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

仍然可達的泄漏檢測

仍然可達的泄漏檢測

C C++
蝴蝶刀刀 2019-07-11 16:21:33
仍然可達的泄漏檢測這個塊中提到的所有函數都是庫函數。我如何糾正這個內存泄漏?它列在“仍可達“類別。(還有4種,它們非常相似,但大小不同)?!?nbsp;630 bytes in 1 blocks are still reachable in loss record 5 of 5     at 0x4004F1B: calloc (vg_replace_malloc.c:418)     by 0x931CD2: _dl_new_object (dl-object.c:52)     by 0x92DD36: _dl_map_object_from_fd (dl-load.c:972)     by 0x92EFB6: _dl_map_object (dl-load.c:2251)     by 0x939F1B: dl_open_worker (dl-open.c:255)     by 0x935965: _dl_catch_error (dl-error.c:178)     by 0x9399C5: _dl_open (dl-open.c:584)     by 0xA64E31: do_dlopen (dl-libc.c:86)     by 0x935965: _dl_catch_error (dl-error.c:178)     by 0xA64FF4: __libc_dlopen_mode (dl-libc.c:47)     by 0xAE6086: pthread_cancel_init (unwind-forcedunwind.c:53)     by 0xAE61FC: _Unwind_ForcedUnwind (unwind-forcedunwind.c:126)捕獲:一旦我運行了我的程序,它就不會產生內存泄漏,但是它在Valrun輸出中有一個額外的行,這在以前是不存在的:在/lib/libgcc_s-4.4.4-20100630.so.1中丟棄0x5296fa0-0x52af438中的Syms,原因是munmap()如果泄漏無法糾正,至少有人能解釋munmap()行為什么導致Val差爾報告0“仍然可以到達”泄漏嗎?
查看完整描述

3 回答

?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

定義“內存泄漏”的方法不止一種。特別是,“內存泄漏”有兩個主要的定義,它們是程序員常用的。

“內存泄漏”的第一個常用定義是,“在程序結束之前,內存被分配,隨后未被釋放。”然而,許多程序員(正確地)認為,符合這個定義的某些類型的內存泄漏實際上并不構成任何類型的問題,因此不應該考慮。千真萬確“記憶泄漏”。

可以說,“內存泄漏”的一個更嚴格(也更有用)的定義是,“內存被分配了,并且不可能隨后釋放,因為程序不再有指向已分配內存塊的指針?!皳Q句話說,您不能釋放不再有指針的內存。因此,這種內存是”內存泄漏“。Val差倫對”內存泄漏“一詞使用了更嚴格的定義。這是一種可能導致堆耗盡的類型,特別是對于長期存在的進程。

Val差爾泄漏報告中的“仍然可達”類別指的是只符合“內存泄漏”的第一個定義的分配。這些塊沒有被釋放,但是它們可以被釋放(如果程序員愿意的話),因為程序仍然在跟蹤指向這些內存塊的指針。

一般來說,沒有必要擔心“仍然可以到達”塊。他們不會提出這樣的問題千真萬確內存泄漏會導致。例如,通常沒有可能從“仍然可達”的塊中耗盡堆。這是因為這些塊通常是一次分配,對其的引用在整個過程的生存期內保持不變。而您可以通過并確保您的程序釋放分配內存時,這樣做通常沒有實際好處,因為在進程終止后,操作系統將回收進程的所有內存。對比一下千真萬確內存泄漏,如果沒有固定,如果保持足夠長的運行時間,可能會導致進程耗盡內存,或者只會導致進程消耗比所需的內存多得多的內存。

確保所有分配都具有匹配的“frees”可能唯一有用的情況是,如果您的泄漏檢測工具無法判斷哪些塊“仍可訪問”(但Val差爾可以做到這一點),或者如果您的操作系統沒有回收終止進程的所有內存(所有平臺都已被移植以完成此操作)。


查看完整回答
反對 回復 2019-07-11
?
米脂

TA貢獻1836條經驗 獲得超3個贊

由于底部有一些來自p線程家族的例程(但我不知道具體的例程),我猜您已經啟動了一些可連接的線程,該線程已經終止了執行。

在調用之前,該線程的退出狀態信息是可用的。pthread_join..因此,內存保存在程序終止時的丟失記錄中,但由于您可以使用pthread_join去訪問它。

如果此分析是正確的,則啟動這些分離的線程,或者在終止程序之前加入它們。

編輯:我運行了您的示例程序(經過一些明顯的更正后),我沒有錯誤,但如下所示

==18933== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)--18933-- --18933-- used_suppression:     
 2 dl-hack3-cond-1--18933-- used_suppression:      2 glibc-2.5.x-on-SUSE-10.2-(PPC)-2a

因為dl-事情很像你所看到的,我猜你看到了一個已知的問題,它有一個抑制文件的解決方案。valgrind..也許您的系統不是最新的,或者您的發行版沒有維護這些東西。(我的是ubuntu 10.4,64位)


查看完整回答
反對 回復 2019-07-11
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

以下是對“仍然可達”的適當解釋:

“仍然可達”是分配給全局和靜態局部變量的泄漏。因為valcher跟蹤全局和靜態變量,所以它可以排除分配給“一次性遺忘”的內存分配。分配一次且從不重新分配的全局變量分配通常不是“泄漏”,因為它不會無限期地增長。從嚴格意義上講,這仍然是一個漏洞,但除非你是學究的,否則通常是可以忽略的。

分配而不是自由分配的局部變量幾乎總是泄漏。

下面是一個例子

int foo(void){
    static char *working_buf = NULL;
    char *temp_buf;
    if (!working_buf) {
         working_buf = (char *) malloc(16 * 1024);
    }
    temp_buf = (char *) malloc(5 * 1024);

    ....
    ....
    ....}

瓦蘭德將報告Work_BUF為“仍然可達-16k”,temp_BUF報告為“絕對丟失-5k”。


查看完整回答
反對 回復 2019-07-11
  • 3 回答
  • 0 關注
  • 456 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號