shared_ptrs的unordered_map打破了C ++程序

时间:2012-12-21 10:50:58

标签: c++ debugging boost c++11

我在当前的C ++项目中使用unordered_map并遇到以下问题:

当我将一对对象插入unordered_map时,程序会断开,Windows会显示“[...]。exe已经停止工作”,而没有在控制台上给我任何信息(cmd) 。一些示例代码:

#include <unordered_map>

#include <network/server/NetPlayer.h>
#include <gamemodel/Player.h>


int main(int argc, char **argv) {
    NetGame game;
    boost::asio::io_service io_service;

    NetPlayerPtr net(new NetPlayer(io_service, game));
    PlayerPtr player(new Player);

    std::unordered_map<PlayerPtr, NetPlayerPtr> player_map;

    // Here it breaks:
    player_map[player] = net;

    return 0;
}

我已经尝试过:

我尝试用try-catch包装线,但没有成功。

有关代码的详细信息:

NetPlayerPtr和PlayerPtr是boost::shared_ptr个对象,前者包含boost::asioio_servicesocket个对象,后者包含多个自定义对象。

我正在使用在64位Windows上启用C ++ 11的MinGW gcc进行编译。

如果需要更多详细信息,请询问。

1 个答案:

答案 0 :(得分:3)

好的,让我们看看你链接的代码:

namespace std
{
    template<>
    class hash<Player>
    {
    public:
        size_t operator()(const Player &p) const
        {
            // Hash using boost::uuids::uuid of Player
            boost::hash<boost::uuids::uuid> hasher;
            return hasher(p.id);
        }
    };

    template<>
    class hash<PlayerPtr>
    {
    public:
        size_t operator()(const PlayerPtr &p) const
        {
            return hash<PlayerPtr>()(p);   // infinite recursion
        }
    };
}

您的hash<PlayerPtr>::operator()中有一个无限递归。你可能想要的是:

return hash<Player>()(*p);

或:

return hash<Player*>()(p->get());

取决于您是否要通过其内部ID或地址识别播放器。