我的一些代码在调用以下函数时遇到了问题:
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
}
我做了什么,为什么有效?
最佳答案
在您的第一个示例中,您将 this
分配给两个不同的 std::shared_ptr
,导致双重 delete
。
在你的第二个例子中,你将 this
分配给 one std::shared_ptr user
,当你给它作为要插入的参数。
关于c++ - std::shared_ptr 用于 std::map 中的值破坏我的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546680/