Необработанное исключение в 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 ():
пункт (это) стать нулевым!
Зачем??
Проблема здесь, скорее всего, не в weak_ptr
, который используется правильно.
На самом деле, код, который вы разместили, полностью в порядке, поэтому ошибка должна быть в другом месте. Необработанные аргументы указателя и длины указывают на возможное повреждение памяти.
Помните, что отладчик может лгать вам, если вы случайно испортили кадры стека из-за повреждения памяти. Поскольку вы, кажется, отлаживаете это из мини-дампов, возможно, что дамп поглотил некоторую информацию здесь.
Имейте в виду, коррумпированный this
указатель, который вы видите здесь — это просто значение в стеке! Основной объект, скорее всего, еще жив, поскольку вы поддерживаете несколько shared_ptr
s к нему (вы можете проверить это в отладочной сборке, проверив, перезаписано ли оригинальное расположение объекта в памяти магическими числами). Это действительно просто ваши значения стека, которые являются поддельными. Я определенно рекомендую вам дважды проверить стек вручную, используя память VS и зарегистрировать окна. Если у вас есть повреждение памяти, оно должно стать видимым там.
Также рассмотрите возможность временного увеличения объема данных, сохраненных в мини-дампе, если он выбрасывал слишком много.
Наконец, убедитесь, что вы дважды проверили обработку буфера. Весьма вероятно, что вы где-то там запутались, и запись в буфер за пределами допустимого диапазона привела к повреждению.
Обратите внимание, что ваш this
недействителен (0x00000001), т.е. объект был уничтожен. Notify
функция-член была вызвана для уничтоженного объекта. Это очевидно вылетает, как только Notify
пытается получить доступ к элементу объекта.