2012-08-12 78 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