编辑:解决了,我知道但是我不明白为什么。
我从
更改了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
等于什么并不重要。
答案 0 :(得分:6)
问题的答案非常简单:如果正确使用代码,std::unordered_map
将不会创建分段错误!所以问题就变成了:使用std::unordered_map
时典型的用户错误是什么?副手我会立即想到三个问题:
T
是否正确实现了复制构造。特别是,如果复制构造函数不在类中,但是类具有赋值运算符或析构函数,则需要注意它。鉴于密钥是int
并且提供了哈希码和相等性,我将集中讨论第一个问题。也就是说,一旦我证明使用std::unordered_map
确实是问题,我就会专注于此:分段违规也可能很容易因事先搞砸而导致。例如,某些东西可能会以错误的方式覆盖内存或删除内存等。像purify或valgrind这样的工具可以帮助找到这些问题。在任何情况下,您都希望将程序归结为最小的崩溃示例。通常我发现问题在这个过程中变得明显。