c++ - std::shared_ptr 用于 std::map 中的值破坏我的对象

标签 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
}

我做了什么,为什么有效?

最佳答案

在您的第一个示例中,您将 this 分配给两个不同的 std::shared_ptr,导致双重 delete

在你的第二个例子中,你将 this 分配给 one std::shared_ptr user,当你给它作为要插入的参数。

关于c++ - std::shared_ptr 用于 std::map 中的值破坏我的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546680/

相关文章:

c++ - 将 COLORREF 转换为 const char

python - OS X El Capitan 上的 dlopen 错误 "unsafe use of relative rpath"

c++ - 套接字标识符等于 -1

android - SupportMapFragment 与 ViewPager : Cannot move camera or change map settings

ruby - 如何调用数组中给定的不同方法

c++ - 使用 dynamic_pointer_cast 通过引用获取 shared_ptr

c++ - 如何从集合中删除共享 ptr 元素?

C++ 类型特征虚拟示例 : compiler error

haskell - map 。 foldr 函数组合 - Haskell

c++ - 使用 std::tr1::shared_ptr 作为引用计数的内部机制