简体   繁体   中英

Boost unordered_map - bug or improper usage?

I am getting strange behavior from within the boost::unordered_map library (v1.45.0).

In my class I create an object:

boost::unordered_map<uint16, MyStruct *> bufferStructMap;

Then I initialize it in the constructor initialization list:

 MyClass::MyClass () : bufferStructMap( ) { .... } 

Then I try to pull something out of it using the method " at " (see API in link):

const uint16 bufferNumber = 1;
try {

    MyStruct * ptr = ( this->bufferStructMap.at( bufferNumber ) );
}
catch ( std::out_of_range & e ){

  //deal with exception
}

When the map is empty, the application aborts with the call to "bufferStructMap.at(... )", even though the API says the only exception that can be thrown is a std::out_of_range.

Can anyone detect a problem with my code, or is this a boost bug?

Thanks!

I would rather catch as const reference

catch ( std::out_of_range const& e ){

This code has no problems:

#include "boost/unordered_map.hpp"
#include <exception>
#include <iostream>

struct MyStruct {};
boost::unordered_map<int, MyStruct *> bufferStructMap;

int main() {
    try {
        MyStruct * ptr = (bufferStructMap.at( 1 ) );
    }
    catch ( std::out_of_range & e ){
      std::cout << "caught\n";
    }
}

So I guess your problem is somewhere else - you need to post more code.

Mark B is probably right. If not, it looks like a bug in Boost.

Although... Since std::tr1::unordered_map (and the C++0x version? not sure) does not provide at(), you might want to just use find().

// Save typing, allow easy change to std::unordered_map someday
typedef boost::unordered_map<uint16, MyStruct *> map_t;

map_t bufferStructMap;

...

map_t::const_iterator p = bufferStructMap.find(bufferNumber);
if (p == bufferStructMap.end())
    // not found
else
    // p->second is your value

Instead of catching std::out_of_range , try std::exception . Then you can use the what member to get more information about the exception.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM