2012-08-12 79 views
0

我在程序中使用映射將稀疏矩陣轉換爲緊湊陣列。Std Map給出分割錯誤

map<int, int> m_mCustIds; 
map<int, int>::iterator itr; 

for (i=0; i<m_nRatingCount; i++) 
{ 
Data* rating = m_aRatings + i; 
itr = m_mCustIds.find(rating->CustId); 
if (itr == m_mCustIds.end()) 
    { 
     cid = 1 + (int)m_mCustIds.size(); 
    } 
    else 
    { 
     cid = itr->second; 
    } 
// using cid in other data structures 
} 

處理條目的固定數(100498277)後,它給我一個段故障。

GDB Output 
Program received signal SIGSEGV, Segmentation fault. 
0x0000000000401ea0 in std::less<int>::operator() (this=0x2aab0adf5ed8, [email protected], [email protected]) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_function.h:227 
227   { return __x < __y; } 

BT示出

#0 0x0000000000401ea0 in std::less<int>::operator() (this=0x2aab0adf5ed8, [email protected], [email protected]) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_function.h:227 
#1 0x000000000040218f in std::_Rb_tree<int, std::pair<int const, int>, std::_Select1st<std::pair<int const, int> >, std::less<int>, std::allocator<std::pair<int const, int> > >::find (this=0x2aab0adf5ed8, [email protected]) at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h:1317 
#2 0x0000000000402243 in std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > >::find (this=0x2aab0adf5ed8, [email protected]) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_map.h:534 
#3 0x0000000000401b18 in Engine::CalcMetrics (this=0x2aaaaaad9010) at At.cpp:204 
#4 0x0000000000401da3 in main() at At.cpp:141 

Valgrind的輸出

==18544== Invalid read of size 4 
==18544== at 0x401EA0: std::less<int>::operator()(int const&, int const&) const (stl_function.h:227) 
==18544== by 0x40218E: std::_Rb_tree<int, std::pair<int const, int>, std::_Select1st<std::pair<int const, int> >, std::less<int>, std::allocator<std::pair<int const, int> > >::find(int const&) (stl_tree.h:1317) 
==18544== by 0x402242: std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > >::find(int const&) (stl_map.h:534) 
==18544== by 0x401B17: Engine::CalcMetrics() (At.cpp:204) 
==18544== by 0x401DA2: main (At.cpp:141) 
==18544== Address 0x22 is not stack'd, malloc'd or (recently) free'd 

Valgrind的還報告在地圖 的其他功能的數據的possilbe損失程序只使用10%的可用的系統內存。

請幫

+0

'我'是什麼類型?你將它添加到'Data *'類型的東西,並將其與'm_nRatingCount'進行比較。 – Shep 2012-08-12 16:11:57

+0

我是int類型的,因爲m_nRatingCount是 – siddhu323 2012-08-12 16:20:47

+0

哪一行是204? – 2012-08-12 16:20:49

回答

2

您沒有訪問itr->second之前初始化itr。事實上,你根本沒有給itr分配任何合法價值。

+0

格式化時,我不小心刪除了這一行。我現在編輯它。 itr = m_mCustIds.find(rating-> CustId); – siddhu323 2012-08-12 16:07:37

+0

@ siddhu323:那麼如何獲得'm_aRatings'呢?它的類型是什麼?你確定'rating'指向一個合法地址嗎? – timrau 2012-08-12 16:09:57

+0

m_aRatings是Data類型的數組。數據是具有以下定義的結構: struct Data int CustId; int MovieId; int評級; float Cache; }; 我認爲它確實指向了一個合法的地址,因爲它對於大量的條目正常工作。 – siddhu323 2012-08-12 16:16:02