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给两个不同std::shared_ptr的 s,从而产生一个 double delete

在您的第二个示例中,您分配thisone std::shared_ptr user,当您将其作为要插入的参数时,它会得到正确的引用计数。

于 2012-11-24T23:29:28.847 回答