我在程序中使用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, __x=@0x22, __y=@0x2aab0a80f0a4)
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, __x=@0x22, __y=@0x2aab0a80f0a4)
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, __k=@0x2aab0a80f0a4) 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, __x=@0x2aab0a80f0a4)
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还报告了地图其他功能中数据丢失的可能性 该程序仅使用可用系统内存的10%。
请帮忙
答案 0 :(得分:2)
在访问itr
之前,您未初始化itr->second
。实际上,您根本没有为itr
分配任何合法价值。