【问题标题】:Std Map giving Segmentation faultStd Map 给出分段错误
【发布时间】:2012-08-12 15:54:22
【问题描述】:

我在程序中使用 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 % 的可用系统内存。

请帮忙

【问题讨论】:

  • i 是什么类型?您将其添加到 Data* 类型的内容中,然后将其与 m_nRatingCount 进行比较。
  • i 是 int 类型,m_nRatingCount 也是如此
  • 第 204 行是 itr = m_mCustIds.find(rating->CustId);

标签: c++ map segmentation-fault std


【解决方案1】:

在访问itr-&gt;second 之前,您没有初始化itr。实际上,您根本没有为 itr 赋予任何合法价值。

【讨论】:

  • 我在格式化时不小心删除了这一行。抱歉。我现在已经编辑过了。 itr = m_mCustIds.find(rating->CustId);
  • @siddhu323:那你怎么获得m_aRatings呢?它的类型是什么?您确定rating 指向合法地址吗?
  • m_aRatings 是一个数据类型的数组。 Data 是一个结构体,定义如下 struct Data { int CustId;诠释电影ID;国际评级;浮动缓存; };我认为它确实指向了一个合法地址,因为它对于大量条目都可以正常工作。
  • '它对大量条目工作正常'。这并不能保证它总是正确的。对我来说似乎是最可能的原因。
  • Valgrind 是否报告任何正常工作较小的输入?
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2019-11-17
  • 2019-02-23
相关资源
最近更新 更多