weak-ptr становится нулевым, приложение вылетает 1 раз в неделю

Необработанное исключение по адресу 0x764F135D (kernel32.dll) в файле RFNReader_NFCP.exe.4448.dmp: 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(): введите здесь описание изображенияэлемент(это) стать нулевым!

Зачем??


person Scott 混合理论    schedule 09.09.2013    source источник
comment
я предполагаю, что m_observerList является вектором ‹std::weak_ptr›. В любом случае, я не понимаю, о каком общем-ptr вы говорите, что он становится нулевым. это стало нулевым, но я понятия не имею, как вы это называете. Но я бы хотел сказать, что все, на что указывает this, истекло, и вы не проверяете это.   -  person IdeaHat    schedule 09.09.2013
comment
Больше похоже на повреждение памяти в другом месте. Цикл кажется правильным (приращение против erase()), и lock() правильно используется для создания shared_ptr. Единственным подозрительным моментом является то, что buf является указателем (почему бы не сделать его vector<char> или string?). Попробуйте прокомментировать вызов Update() и посмотрите, изменится ли поведение.   -  person DanielKO    schedule 09.09.2013
comment
Обратите внимание, что ваш this недействителен (0x00000001), т.е. объект был уничтожен. Для уничтоженного объекта была вызвана функция-член Notify.   -  person Igor R.    schedule 11.09.2013
comment
Этот указатель this находится в кадре стека Update, а не в кадре Notify. Более вероятно, что рама стека была разбита.   -  person Useless    schedule 11.09.2013


Ответы (2)


Проблема здесь, скорее всего, не в weak_ptr, который используется правильно.

На самом деле код, который вы разместили, полностью исправен, поэтому ошибка должна быть в другом месте. Необработанные аргументы указателя и длины указывают на возможное повреждение памяти.

Имейте в виду, что отладчик может солгать вам, если вы случайно испортите кадры стека из-за повреждения памяти. Поскольку вы, кажется, отлаживаете это из минидампа, возможно, что дамп проглотил здесь некоторую информацию.

Имейте в виду, поврежденный указатель this, который вы видите здесь, — это просто значение в стеке! Базовый объект, скорее всего, все еще жив, поскольку вы поддерживаете для него несколько shared_ptr (вы можете проверить это в отладочной сборке, проверив, не было ли исходное местоположение объекта в памяти перезаписано магическими числами). На самом деле просто ваши значения стека являются поддельными. Я определенно рекомендую вам дважды проверить стек вручную, используя память VS и окна регистрации. Если у вас есть повреждение памяти, оно должно стать видимым там.

Также рассмотрите возможность временного увеличения объема данных, сохраненных в минидампе, если он выбросил слишком много.

Наконец, убедитесь, что вы дважды проверили обработку буфера. Очень вероятно, что вы где-то напортачили, и запись за пределы буфера вызвала повреждение.

person ComicSansMS    schedule 11.09.2013

Обратите внимание, что ваш this недействителен (0x00000001), т.е. объект был уничтожен. Для уничтоженного объекта была вызвана функция-член Notify. Это, очевидно, дает сбой, как только Notify пытается получить доступ к члену объекта.

person Igor R.    schedule 11.09.2013