В настоящее время существует одно исключение из программы, написанной C++, и выполняется под окнами.Каким образом это нарушение доступа к адресу?
вот информация о минимальном дампе в журналах.
08/12/15 04:37:19 I New Information for UID 2d936a, FloorLoc F1505
08/12/15 04:37:19 E >>>>> EXCEPTION: Access Violation while trying to read address 20203567
[Fault address: 004AF945 01:000AE945 C:\Program Files (x86)\MySystems\WPR.exe 00400000] <<<<<
Call stack:
Load addr Address Frame Logical addr Module
00400000 004AF945 0588F8CC 0001:000AE945 C:\Program Files (x86)\MySystems\WPR.exe
00400000 004A89A4 0588FAEC 0001:000A79A4 C:\Program Files (x86)\MySystems\WPR.exe
Согласно логическому адру и .map
файла, я могу найти коды, где брошенные это исключение.
if (TempMSE->m_elem == NULL)
{
TempMSE->m_elem = new Element(element);
TempMSE->m_elem->SetLocation(FloorLoc);
LoggerInfo("New Information for UID %x, FloorLoc %s", Id, FloorLoc.ToString(buf));
}
TempMSE->m_elem->SetValue0(CIN_0, 0); // this exception is thrown here!!! through logical address 0001:000AE945
Кажется, что m_elem
получает один адрес от new
оператора, и никаких исключений для SetLocation
вызова функции. Также корректно отображается следующий журнал.
Почему у нас возникает одно исключение из SetValue0
? Здесь функция SetValue0
void SetValue0(INDEX idx, DWORD val)
{
if (idx >= 0 && idx < MAX_INDEX){
if(val != m_Info[idx])
{
m_Info[idx] = val;
}
}
}
m_Info
одна переменная массива в Element
, а размер ее составляет MAX_INDEX
.
С другой стороны, адрес 0x20203567
кажется удобным для чтения адресом, как его можно считать нарушением?
Редактировать
Добавить больше информации здесь
class Element {
// other function here...
private:
FloorLocation m_FloorLoc;
DWORD m_Info[MAX_INDEX];
bool m_Dirty;
};
Element::Element(const Element& elem) {
m_FloorLoc = elem.m_FloorLoc;
for (int i = 0; i < MAX_INDEX; ++i)
m_Info[i] = elem.m_Info[i];
m_Dirty = elem.m_Dirty;
}
class FloorLocation {
// other function here...
private:
FloorId m_floorloc;
};
FloorLocation::FloorLocation(const FloorLocation& loc)
{
memset(&m_floorloc, ' ', 8); // space filled
if(loc.m_floorloc.id[0] != 0)
{
memcpy(m_floorloc.id, loc.m_floorloc.id, 8);
// eliminate nulls
for(int ndx=0; ndx < 8; ndx++)
{
if(m_floorloc.id[ndx] == 0)
m_floorloc.id[ndx]=' ';
}
}
}
typedef struct {
char id[8];
} FloorId;
Это может произойти, если ' TempMSE' или 'TempMSE-> m_elem' не является допустимым адресом или висящим указателем. _e.g._ unintialised или удален и не установлен в NULL, или если 'm_elem' был разбит в буфере, переполненном где-то еще внутри объекта. – paddy
« 20203567 »выглядит как символы ASCII. Вы проверили, что указатель 'm_elem' указывает на (записываемый) ОЗУ вместо некоторых данных readonly const? – harper
@harper, вы хотите проверить возврат указателя 'new Element'? – zangw