在RFNReader_NFCP.exe.4448.dmp中0x764F135D (kernel32.dll)处未处理的异常: 0xC0000005:访问冲突写入位置0x000001。
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
但在项目->更新()中:

项(此)变为空!
为什么??
发布于 2013-09-11 09:21:45
这里的问题很可能不是正确使用的weak_ptr。
实际上,您发布的代码是完全正确的,因此错误必须发生在其他地方。原始指针和长度参数表示可能存在内存损坏。
请注意,如果您由于内存损坏而不小心损坏堆栈帧,调试器可能会对您撒谎。由于您似乎是从一个微型调试这一点,它也可能是倾销吞没了一些信息在这里。
请注意,您在这里看到的损坏的this指针只是堆栈上的一个值!底层对象很可能仍然活着,因为您正在维护它的几个shared_ptr(您可以在调试构建中通过检查对象的原始内存位置是否被神奇的数字覆盖来验证这一点)。实际上只是你的堆栈值是假的。我绝对建议您使用VS的内存和注册窗口手动检查堆栈。如果您确实有一个内存损坏,它应该可以在那里可见。
另外,如果存储的数据量太大,也可以考虑临时增加保存到最小节点的数据量。
最后,确保您再次检查您的缓冲区处理。很可能你在某个地方搞砸了,一个越界的缓冲区写导致了损坏。
发布于 2013-09-11 06:16:45
注意,您的this是无效的(0x00000001),即该对象被销毁。已销毁对象的Notify成员函数被调用。显然,一旦Notify试图访问对象成员,它就会崩溃。
https://stackoverflow.com/questions/18701578
复制相似问题