Слабый 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 shared_ptr {m_interface = «10.243.112.12» m_port = «8889» m_clientSockets = {size = 0} …} [3 сильных ссылки, 2 слабых ссылки] [по умолчанию] std :: tr1 :: shared_ptr

но в item-> Update ():
введите описание изображения здесь
пункт (это) стать нулевым!

Зачем??

1

Решение

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

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

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

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

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

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

1

Другие решения

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

0

По вопросам рекламы [email protected]