weak-ptr变为null,每周崩溃app 1次

时间:2013-09-09 15:18:13

标签: 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 );
        }
    }
}
调试窗口中的

变量的值:  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 项目(this)变为空!

为什么?

2 个答案:

答案 0 :(得分:1)

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

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

请注意,如果由于内存损坏而意外搞乱堆栈帧,调试器可能会对您不利。因为你似乎是从一个小型转储调试这个,所以转储也可能在这里吞下了一些信息。

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

如果它丢失得太多,也可以考虑暂时增加保存到minidump的数据量。

最后,请务必仔细检查缓冲区处理情况。你很可能在某处弄乱了,而且越界缓冲区写入导致了腐败。

答案 1 :(得分:0)

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