std :: shared_ptr for std :: map中的值销毁我的对象

时间:2012-11-24 23:21:55

标签: c++ map shared-ptr

我的一些代码遇到了以下函数调用的问题:

User::User(const Socket::SocketAddress& addr) {
    address = addr;
    _usersListBySession.insert(std::pair<uint32_t, std::shared_ptr<User>>(sessionID, std::shared_ptr<User>(this)));
    assert(this->address == addr); // succeeds
    _userListByAddress.insert(std::pair<Socket::SocketAddress, std::shared_ptr<User>>(addr, std::shared_ptr<User>(this)));
    assert(this->address == addr); // fails
}

我通过这样做解决了这个问题:

User::User(const Socket::SocketAddress& addr) {
    address = addr;
    std::shared_ptr<User> user(this);
    _usersListBySession.insert(std::pair<uint32_t, std::shared_ptr<User>>(sessionID, user));
    assert(this->address == addr); // succeeds
    _userListByAddress.insert(std::pair<Socket::SocketAddress, std::shared_ptr<User>>(addr, user));
    assert(this->address == addr); // succeeds
}

我做了什么以及为什么会这样做?

1 个答案:

答案 0 :(得分:2)

在第一个示例中,您将this分配给两个不同的std::shared_ptr,从而产生了双倍delete

在您的第二个示例中,您将this分配给一个 std::shared_ptr user,当您将其作为插入参数时,会将其正确地重新计算。