2013-10-24 4 views
3

Я использую unordered_map как HashMap в C++, но всякий раз, когда я пытаюсь сохранить что-нибудь там, я получаю:Плавающий исключение точки при хранении что-то в unordered_map

Floating point exception: 8

Можно ли указать, что ошибка есть? Далее, как я инициализируется моя карта (table_entry это просто структура):

std::tr1::unordered_map<unsigned short, table_entry*> forwarding_table;

Тогда я надевал запись в выполнив:

unsigned short dest_id = 0;  
table_entry *entry = (table_entry *)malloc(sizeof(table_entry)); 
forwarding_table[dest_id] = entry; 

определение моей структуры является:

typedef struct table_entry { 
    unsigned short next_hop; 
    unsigned int cost; 
} table_entry; 

Что касается моей версии для компилятора, когда я запускаю g++ -v Я получаю это:

Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1 Thread model: posix gcc version 4.2.1

+0

Если 'table_entry' не является типом POD, у вас будет плохое время. – chris

+0

Просто посмотрел, что такое тип POD, и я считаю, что это так. Я добавлю свое определение структуры только для ясности. – Penguinator

+0

@chris, просто сохранение указателя должно быть хорошо, что бы ни случилось, когда вы пытаетесь его использовать. –

ответ

1

Недавно я столкнулся с той же проблемой, используя различные экземпляры std::unordered_map<>. Однако я могу только воспроизвести проблему, когда карта является глобальной для общего объекта. Если карта объявлена ​​глобальной в программе или как локальная внутри функции, то проблема не проявляется.

(Примечание: Я использую GCC 4.9.4, 32-битный режим, с -std = C++ 11)

Это кажется, что выделения std::unordered_map<> на куче решает мою проблему. Может, это решит твою? Рассмотрим замену:

std::tr1::unordered_map<unsigned short, table_entry*> forwarding_table; 

с

std::tr1::unordered_map<unsigned short, table_entry*>* forwarding_table; 

И затем обновление использования forwarding_table надлежащим образом.

+0

Немного больше googling показывает другое обходное решение: вставка вызова reserve() перед первым использованием, похоже, решает проблему. См. [GCC Bugzilla] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61143) –