首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弱ptr变为空,每周崩溃1次。

弱ptr变为空,每周崩溃1次。
EN

Stack Overflow用户
提问于 2013-09-09 15:18:12
回答 2查看 680关注 0票数 1

在RFNReader_NFCP.exe.4448.dmp中0x764F135D (kernel32.dll)处未处理的异常: 0xC0000005:访问冲突写入位置0x000001。

代码语言:javascript
复制
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

但在项目->更新()中:

项(此)变为空!

为什么??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-11 09:21:45

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

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

请注意,如果您由于内存损坏而不小心损坏堆栈帧,调试器可能会对您撒谎。由于您似乎是从一个微型调试这一点,它也可能是倾销吞没了一些信息在这里。

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

另外,如果存储的数据量太大,也可以考虑临时增加保存到最小节点的数据量。

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

票数 1
EN

Stack Overflow用户

发布于 2013-09-11 06:16:45

注意,您的this是无效的(0x00000001),即该对象被销毁。已销毁对象的Notify成员函数被调用。显然,一旦Notify试图访问对象成员,它就会崩溃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18701578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档