2013-02-19 35 views
7

我正在面對代碼中的內存泄漏問題,而它的運行時,堆增加到最大,我需要重新啓動服務,我運行了頂層命令,並看到堆正在增加,每當我調用場景中的服務。valgrind條件跳轉或移動取決於未初始化的值,這是否表示內存泄漏?

我跑了Valgrind的服務,

valgrind --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice 

我DONOT看到任何絕對丟失或可能丟失蓋帽,IAM運行的情況,但我看到了很多條件跳轉或移動的依賴於未初始化值(S)錯誤。

做這些計算內存泄漏?我所得到的

例子:

==27278== Conditional jump or move depends on uninitialised value(s) 

==27278== at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

........

==27278== Uninitialised value was created by a heap allocation 

==27278== at 0x4A078B8: malloc (vg_replace_malloc.c:270) 

==27278== by 0xC90E32F: xcsGetMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

誰能幫。

+0

您是否找到了正確的答案?如果是,請標出一個正確的。 – logoff 2013-02-20 08:03:22

+0

[精確定位]條件跳轉或移動的可能重複取決於未初始化的值「valgrind消息」(http://stackoverflow.com/questions/2612447/pinpointing-conditional-jump-or-move-depends-on-uninitialized -values-valgrin) – 2015-02-20 15:45:07

回答

15

不,這意味着你正在訪問尚未初始化的內存:

int main() 
{ 
    int unitialized; 
    std::cout << unitialized << std::endl; 
} 

會引發此錯誤。

略較常見的是:

struct X 
{ 
    X() : i(42) { } 
    private: 
    int i; 
    int* forgotten; // oops, not initialized 
}; 

最後,這往往與基於malloc的代碼發生了,當你不使用memset清除整個緩衝區。所以,

  1. malloc的緩衝器大小爲m
  2. 讀取(例如從插座)n個字節
  3. 寫M個字節到文件; (M-N)個字節就不會被初始化
+0

我同意這並不表示內存泄漏,但因爲它調用未定義的行爲,可能導致任何事情 – 2013-02-19 08:09:22

1

沒有這並不直接指示內存泄漏。但是具有取決於未初始化變量可能導致幾乎任何一個條件跳轉。通常使用未初始化的變量會調用未定義的行爲。

+2

在C中,使用未初始化的對象本身並不是未定義的行爲。如果對象「可能已經用」register「聲明瞭,那就是UB,如果它的地址永遠不會被使用的話。通過指針讀取未初始化的內存非常好(從POV開始)。這是Valgrind正確地抱怨的價值觀的分支。 – 2013-02-19 08:19:41

4

它在Valgrind的用戶手冊說明,在第4.2.2. Use of uninitialised values

當你的程序使用尚未初始化一個 值報告的未初始化值的使用錯誤 - 換句話說,是未定義。

...

明白,你的程序可以圍繞 垃圾(未初始化)數據複製爲多,因爲它喜歡的是很重要的。 MEMCHECK觀察到這個 和跟蹤數據,但不抱怨。投訴是隻有當你的程序試圖使用未初始化的 數據的方式,可能會影響你的程序的外部可見 行爲發出 。

相關問題