4

次の関数呼び出しでコードの一部に問題がありました。

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
}

私が何をしたか、なぜそれが機能するのですか?

4

1 に答える 1

3

this最初の例では、 2 つの異なるに代入しstd::shared_ptr、結果として double になりdeleteます。

2 番目の例では、挿入するパラメーターとして指定すると、適切に参照カウントさthisれるone に割り当てます。std::shared_ptr user

于 2012-11-24T23:29:28.847 に答える