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 个强引用,2 个弱引用] [默认] std::tr1::shared_ptr
但是在 item->Update() 中: item(this) 变为空!
为什么??
最佳答案
这里的问题很可能不是正确使用的weak_ptr
。
事实上,您发布的代码完全没问题,所以错误一定出在其他地方。原始指针和长度参数表明可能存在内存损坏。
请注意,如果您因内存损坏而意外弄乱堆栈帧,调试器可能会欺骗您。由于您似乎是从小型转储中对此进行调试,因此转储也可能吞噬了此处的一些信息。
请注意,您在这里看到的损坏的 this
指针只是堆栈上的一个值!底层对象很可能仍然存在,因为您正在为它维护多个 shared_ptr
(您可以在调试版本中通过检查对象的原始内存位置是否被魔数(Magic Number)覆盖来验证这一点) .实际上只是您的堆栈值是伪造的。我肯定会建议您使用 VS 的内存和注册窗口手动仔细检查堆栈。如果您确实有内存损坏,它应该在那里可见。
还可以考虑临时增加保存到小型转储的数据量,如果它丢弃了太多的话。
最后,请务必仔细检查您的缓冲区处理。很可能您在某处搞砸了,越界缓冲区写入导致了损坏。
关于c++ - weak-ptr 变为 null,应用程序每周崩溃 1 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18701578/