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 );
        }
    }
}

调试窗口中变量的值:

项目shared_ptr {m_interface =“10.243.112.12” m_port =“8889” m_clientSockets = {size = 0} ...} [3个强引用,2个弱引用] [默认] std::tr1::shared_ptr

但在item-> Update()中:

项目(this)变为空!

为什么??

最佳答案

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

实际上,您发布的代码是完全可以的,因此错误必须在其他地方。原始指针和长度参数指示可能的内存损坏。

请注意,如果由于内存损坏不小心弄乱了堆栈帧,调试器可能会骗你。由于您似乎正在从小型转储中调试它,这也可能是转储吞没了此处的某些信息。

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

如果丢弃的数据过多,也可以考虑暂时增加保存到该小型转储中的数据量。

最后,请确保仔细检查缓冲区处理。您很可能在某个地方搞砸了,缓冲区写越界导致了损坏。

10-08 01:16