std :: map中的对象指针在通过getter检索时损坏

时间:2016-07-16 19:50:25

标签: c++ c++11 pointers memory

我有一个对象指针的std :: map:std::map<ConnectionID, IConnection *>

它只包含三个条目,每个条目都来自IConnection *,因此我已经为检索每个对象制作了三个便利getter,它将IConnection *条目转换为正确的对象并返回它。它看起来像这样:

GameConnection * Client::GetGameConnection()
{
    GameConnection * pGameConn = NULL;
    if ((pGameConn = (GameConnection *)GetConnection(ConnectionID::GAME_CONNECTION)))
        return pGameConn;

    return nullptr;
}

通用GetConnection()方法如下:

IConnection * Client::GetConnection(ConnectionID nConnID)
{
    auto result = m_connections.find(nConnID);

    if (result != m_connections.end())
    {
        return result->second;
    }

    return nullptr;
}

相当确定GetGameConnection是问题,因为如果我检索整个地图并且这样做了:

std::map<ConnectionID, IConnection *> connections = pClient->GetConnections();
GameConnection * pGameConn = (GameConnection *)connections.at(ConnectionID::GAME_CONNECTION);

如果导致GameConnection *导致问题,那么如何避免这样做,并且仍能像pClient->GetGameConnection()->FooBar();那样方便地调用GameConnection? 从IConnection *GameConnection *的转换应该没问题,因为它来自该接口。

2 个答案:

答案 0 :(得分:1)

我宁愿建议您使用

std::map<ConnectionID,std::shared_ptr<IConnection>> connections;

或至少

std::map<ConnectionID,std::weak_ptr<IConnection>> connections;

让您的生活更轻松。

答案 1 :(得分:0)

您是否正确填充了m_connections地图? 因为它可能是地图中没有值的情况,它将返回nullPtr。

另一种情况可能是你的指针已经过期或变得悬空,所以要防止使用shared_ptr

std::map<ConnectionID,std::shared_ptr<IConnection>> connections;