I had a problem with some of my code with the following function calls:
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
}
I fixed the issue by doing this:
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
}
What did I do and why does it work?
In your first example, you assign
thisto two differentstd::shared_ptrs, resulting in a doubledelete.In your second example, you assign
thisto onestd::shared_ptr user, which gets ref-counted properly, when you give it as a parameter to insert.