2013-10-05 52 views
1

Valgrind告訴我在我的代碼中存在錯誤,但我無法找到它... 這裏是一段代碼:「未初始化的值是由堆棧分配創建的」在C++ std :: map

22 int main(int argc, char *argv[]){ 
... 
//argv[1] contains the name of a file 
int length=atoi(argv[2]); 
map<string, double> Map; 
char* Key; 
Key = new char [length+1]; 
... 

我也使用Key[length]='\0'但這似乎並沒有影響其餘的代碼。

現在我填補地圖從文件(其中包含關鍵字的列表和值的行。關鍵的尺寸始終是長度的下采取的條目。

while(file_stream >> Key >> Value){ 
Map[Key]=Value; 
.... 
} 

在這一點上,我打電話:

cout << Key << " has value "; 
159 cout << Map[Key] << endl; 

程序被編譯並很好地執行,但Valgrind的給很多這種類型的錯誤:

==6921== Conditional jump or move depends on uninitialised value(s) 
==6921== at 0x56274A0: __printf_fp (printf_fp.c:404) 
==6921== by 0x562396A: vfprintf (vfprintf.c:1622) 
==6921== by 0x5648C81: vsnprintf (vsnprintf.c:120) 
==6921== by 0x4EB64AE: ??? (in /usr/lib/libstdc++.so.6.0.13) 
==6921== by 0x4EB9002: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/libstdc++.so.6.0.13) 
==6921== by 0x4EB9328: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (in /usr/lib/libstdc++.so.6.0.13) 
==6921== by 0x4ECCC9E: std::ostream& std::ostream::_M_insert<double>(double) (in /usr/lib/libstdc++.so.6.0.13) 
==6921== by 0x40366E: main (MyProgram.cpp:159) 
==6921== Uninitialised value was created by a stack allocation 
==6921== at 0x401C61: main (MyProgram.cpp:22) 

你有什麼想法嗎?我寧願不發表所有的長碼(請不要怪這個)

謝謝!

+2

爲什麼你有'map '但是然後使用動態分配的'char * Key'而不是'string Key'? – us2012

+0

「你有什麼想法爲什麼我這樣做的錯誤」 - *爲什麼*你做了這個錯誤?不是一個線索。很難進入這個思維過程。 **發佈*真實*,*可編譯*代碼**。 – WhozCraig

+0

@WhozCraig你是對的,我編輯了這個問題。 – altroware

回答

1

堆棧跟蹤意味着您正在格式化double。沒有辦法可以從Map[Key]獲得未初始化的double,除非您明確插入未初始化的double(即使Key不存在於Map中,它將使用double()進行初始化)。這可能指向的__printf_fp()實施中一塊有趣的代碼:我會用一個簡單的測試程序,驗證這是否報告,的確,可以轉載使用,如:

#include <iostream> 
int main() { 
    std::cout << 3.14; 
} 

...,如果所以,我只是忽略來自valgrind的報告。在一個非常平靜的下午,通過深入探索執行__printf_fp()來發現它在哪些方面有問題,並確定它是否真的很重要(我不會賭上對我而言的事情,儘管如此:我寧願實現浮動但是,由於它明顯不重要,可能需要花費一個多天的時間)。

+0

非常感謝。我無法閱讀Valgrind的輸出,所以我將注意力集中在地圖本身上,而不是價值......但是那裏有一個未初始化的值...... – altroware