Sigfpe при доступе к Unordered_mapC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Sigfpe при доступе к Unordered_map

Сообщение Anonymous »

У меня есть Unoromeded_map с блоком, является простой структурой, определенной следующим образом:

Код: Выделить всё

struct Block {
size_t start;
size_t end;

bool operator==(const Block& b) const {
return start == b.start && end == b.end;
}
};

namespace std {
template
struct hash {
size_t operator()(const Block& b) const {
return b.start;
}
};
}
< /code>
При попытке получить доступ к карте я получаю следующее сообщение об ошибке в GDB (то же самое для G ++ 4.7.1, а также Clang ++ 3.1): < /p>
Program received signal SIGFPE, Arithmetic exception.
0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, __num=0, __den=0)
at /usr/include/c++/4.7/bits/hashtable_policy.h:245
245     { return __num % __den; }
< /code>
my libstdc ++ версия - 3.4.17 (то есть версия от GCC 4.7) < /p>
Соответствующая Backtrace: < /p>
#0  0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, __num=0, __den=0)
at /usr/include/c++/4.7/bits/hashtable_policy.h:245
#1  0x0000000000407199 in std::__detail::_Hash_code_base::_M_bucket_index (this=0x7fffffffd8e0, __c=0, __n=0) at /usr/include/c++/4.7/bits/hashtable_policy.h:787
#2  0x0000000000405230 in std::_Hashtable::_M_bucket_index
(this=0x7fffffffd8e0, __k=..., __c=0) at /usr/include/c++/4.7/bits/hashtable.h:466
#3  0x00000000004038de in std::__detail::_Map_base::at (
this=0x7fffffffd8e0, __k=...) at /usr/include/c++/4.7/bits/hashtable_policy.h:474
#4  0x0000000000403001 in SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}::operator()(Block const&) const (__closure=0x7fffffffd990, block=...) at splicing.cpp:151
#5  0x00000000004040b3 in std::for_each(__gnu_cxx::__normal_iterator, SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}, SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}) (__first=..., __last=..., __f=...)
at /usr/include/c++/4.7/bits/stl_algo.h:4442
Редактировать: я не думал, что на самом деле это изменит , где я называю функцию до тех пор, пока я даю ей те же аргументы, но, очевидно, это делает : < /p>

Код: Выделить всё

std::for_each(blocks.begin(), blocks.end(), [&](const Block& block) {
map.at(block);
}
< /code>
приводит к ошибке, а просто: < /p>
const Block& block = blocks[0];
map.at(block);
< /code>
работает совершенно нормально (blocks
быть простым вектором & )


Подробнее здесь: https://stackoverflow.com/questions/135 ... rdered-map
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»