1

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在此处输入图像描述的值: item shared_ptr {m_interface="10.243.112.12" m_port="8889" m_clientSockets={ size=0 } ...} [3 strong refs, 2 weak refs] [default] std:: tr1::shared_ptr

但在 item->Update() 在此处输入图像描述 中: item(this)变为 null!

为什么??

4

2 回答 2

1

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

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

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

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

如果丢失太多,还可以考虑暂时增加保存到小型转储的数据量。

最后,请务必仔细检查您的缓冲区处理。您很可能在某个地方搞砸了,并且超出范围的缓冲区写入导致了损坏。

于 2013-09-11T09:21:45.307 回答
0

请注意,您this的无效(0x00000001),即对象被破坏。Notify为被破坏的对象调用成员函数。一旦Notify尝试访问对象成员,这显然会崩溃。

于 2013-09-11T06:16:45.213 回答