c++ - weak-ptr 变为 null,应用程序每周崩溃 1 次

标签 c++ visual-c++ shared-ptr weak-ptr

RFNReader_NFCP.exe.4448.dmp 中 0x764F135D (kernel32.dll) 的未处理异常:0xC0000005:访问冲突写入位置 0x00000001。

void Notify( const char* buf, size_t len )
{
    for( auto it = m_observerList.begin(); it != m_observerList.end(); )
    {
        auto item = it->lock();
        if( item )
        {
           item->Update( buf, len );
            ++it;
        }
        else
        {
            it = m_observerList.erase( it );
        }
    }
}

变量 item 在调试窗口中的值: enter image description here item shared_ptr {m_interface="10.243.112.12"m_port="8889"m_clientSockets={ size=0 } ...} [3 个强引用,2 个弱引用] [默认] std::tr1::shared_ptr

但是在 item->Update() 中: enter image description here item(this) 变为空!

为什么??

最佳答案

这里的问题很可能不是正确使用的weak_ptr

事实上,您发布的代码完全没问题,所以错误一定出在其他地方。原始指针和长度参数表明可能存在内存损坏。

请注意,如果您因内存损坏而意外弄乱堆栈帧,调试器可能会欺骗您。由于您似乎是从小型转储中对此进行调试,因此转储也可能吞噬了此处的一些信息。

请注意,您在这里看到的损坏的 this 指针只是堆栈上的一个值!底层对象很可能仍然存在,因为您正在为它维护多个 shared_ptr(您可以在调试版本中通过检查对象的原始内存位置是否被魔数(Magic Number)覆盖来验证这一点) .实际上只是您的堆栈值是伪造的。我肯定会建议您使用 VS 的内存和注册窗口手动仔细检查堆栈。如果您确实有内存损坏,它应该在那里可见。

还可以考虑临时增加保存到小型转储的数据量,如果它丢弃了太多的话。

最后,请务必仔细检查您的缓冲区处理。很可能您在某处搞砸了,越界缓冲区写入导致了损坏。

关于c++ - weak-ptr 变为 null,应用程序每周崩溃 1 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18701578/

相关文章:

c++ - 为什么简单的控制台应用程序可以运行,但基于对话框的应用程序不能在 WIN CE 6.0 中运行?

c++ - 将 vector<boost::shared_ptr<Foo>> 转换为 vector<Foo*> ,这可能吗?

visual-c++ - VC++ 8.0 程序出现链接器错误 : Precombiled Library VC++ 6. 0

windows - git可以用VC++搭建吗?

c++ - 如何将共享指针设置为常规指针

c++ - std::shared_ptr 传递删除器

c++ - extern 模板不适用于 gcc?

c++ - 共享指针不增加 use_count

c++ - 运行 g++ 时需要使用 -o 吗?

c++ - boost:asio 线程池实现,用于偶尔同步的任务