unordered_map如何导致sigsegv

时间:2012-01-07 22:07:11

标签: c++ sigsegv unordered-map

编辑:解决了,我知道但是我不明白为什么。

我从

更改了variables声明
tr1::unordered_map<int,T> variables;

unordered_map<int,T> variables;

并且工作正常。

如果你知道为什么请在答案中写下来。

我有一个非常大的程序,所以我不知道我应该带哪个代码。

有一个抽象类,它继承了派生类。 摘要将unordered_map<int,int>(模板)作为私有成员,公共方法insert(int,int)

派生类使用基类insert方法将元素插入unordered_map<int,int>容器,

第一个int使用类似计数器并以0开头。前11个插入元素为O.K.但在第12个元素中,我在stl_function.h(209)中获得了sigsegv和struct equal_to中的错误。

在调试器中我看到unordered_map的bucket_count等于11,也许它是某些东西的线索。

我的编译器是gcc 4.6.1。

也许您可以在unordered_map.insert中一般性地写出可以导致sigsegv的内容?

谢谢,抱歉我的英语不好。

如果我知道哪个,我会带上具体的代码。

编辑: 这是insert方法:

virtual void Insert(int arrayPlace, T value)
{
    if (!isReadOnly)
    {            
        if (IsValueDataValid(value))
        {
           variables[arrayPlace] = value;
        }
        else
        {
            throw 2;
        }            
    }
    else
    {
        throw 4;
    }
};

声明是:

tr1::unordered_map<int,T> variables;

arrayPlace == 11时,sigsegv发生了,而value等于什么并不重要。

1 个答案:

答案 0 :(得分:6)

问题的答案非常简单:如果正确使用代码,std::unordered_map将不会创建分段错误!所以问题就变成了:使用std::unordered_map时典型的用户错误是什么?副手我会立即想到三个问题:

  1. 将对象作为值放入地图中。也就是说,对象需要是可复制的或可移动的。也就是说,我会调查你所使用的类型T是否正确实现了复制构造。特别是,如果复制构造函数不在类中,但是类具有赋值运算符或析构函数,则需要注意它。
  2. 计算出的哈希键实际上不是哈希键,但可能取决于对象的位置。这会导致有趣的行为,因为对象会移动到某种程度(尽管一旦插入它们就会保持不变)。
  3. 与前一个问题类似,相等操作实际上并不是一个平等操作。无序映射需要使用相等运算符来确定具有相同哈希码的两个对象是否确实相同。
  4. 鉴于密钥是int并且提供了哈希码和相等性,我将集中讨论第一个问题。也就是说,一旦我证明使用std::unordered_map确实是问题,我就会专注于此:分段违规也可能很容易因事先搞砸而导致。例如,某些东西可能会以错误的方式覆盖内存或删除内存等。像purify或valgrind这样的工具可以帮助找到这些问题。在任何情况下,您都希望将程序归结为最小的崩溃示例。通常我发现问题在这个过程中变得明显。

相关问题