«Программа неожиданно завершилась».
У меня есть класс, который звонит CMem::Write()
, И отображает итерацию на экране. Иногда оно достигает 140, другие … 12, 3, 42, выпадают сразу … очень случайно.
Если я удалю звонок CMem::Write()
программа будет работать вечно.
Не уверен, почему это прекращение программы? Все, что я могу предположить, это что-то не пишется в CMem::Write()
метод.
CMem::CMem()//sets up the "static" stack memory and the pointers to it; also the "static" positionIndex
{
m_nBufferLength = sizeof(char); //short int
static char *cMessageCB = new char[m_nBufferLength];
static double *dTimeCB = new double[m_nBufferLength];
m_cMessageCB = cMessageCB;
m_dTimeCB = dTimeCB;////////////////////////////////////////
static char *cMessageReadList = new char[m_nBufferLength]; //max size can be the CB
static double *dTimeReadList = new double[m_nBufferLength]; //max size can be the CB
m_cMessageReadList = cMessageReadList;
m_dTimeReadList = dTimeReadList;
static int firstInstance = 0;
if(firstInstance == 0){
m_posRead = 0;//only on first instance
m_posWrite = 0;//only on first instance
firstInstance++;//check to see if multiple threads entered at the same time and look at the count
}
}void CMem::Write()
{//double dTime, char cMessage
//only one thread can write at a time... so lock... (make other threads with various random delays)
static bool bUse = false;
bool bDone = false;while(bDone == false){
if(bUse == false){
bUse = true;m_cMessageCB[m_posWrite] = m_cMessageWrite;
m_dTimeCB[m_posWrite] = m_dTimeWrite;
m_posWrite = (unsigned char)(m_posWrite + 1);static char cFlag = 0;
//if writing position == reading position then flag
if(m_posWrite == m_posRead){
cFlag = 1;
}
bDone = true;
bUse = false;
}else if(bUse == true){
printf("SUSPEND ");
}
}
}void CMem::Read()
{//get the whole block of memory and increment the m_posRead accordingly
unsigned char j = 0;
while( (m_posRead + 1) != (m_posWrite + 1) ){
m_cMessageReadList[j] = m_cMessageCB[m_posRead];//inc m_posRead at the end
m_dTimeReadList[j] = m_dTimeCB[m_posRead];//inc m_posRead at the end
m_posRead = (unsigned char)(m_posRead + 1);//circulate around
j++;// 'j' is not circulating back around
}
//write to file
}
Какой бы код вы ни предоставили, кажется, это явный случай повреждения памяти
Первый
if(firstInstance == 0){
m_posRead = 0;//only on first instance
m_posWrite = 0;//only on first instance
firstInstance++;//check to see if multiple threads entered at the same time and look at the count
}
Выше код инициализирует m_posRead и m_posWrite до 0 только для первого экземпляра. Для всех остальных случаев он не определен.
Во-вторых, в конструкторе вы делаете
m_nBufferLength = sizeof(char); //short int
static char *cMessageCB = new char[m_nBufferLength];
m_cMessageCB = cMessageCB;
Теперь это делает m_cMessageCB шириной всего в 1 байт. Пока в CMem :: Write вы делаете
m_cMessageCB[m_posWrite] = m_cMessageWrite;
m_dTimeCB[m_posWrite] = m_dTimeWrite;
m_posWrite = (unsigned char)(m_posWrite + 1);
Здесь m_posWrite был увеличен. Первый раз он напишет по 0-му индексу. В следующий раз вы вызовете CMem: Write, и он попытается выполнить запись по первому индексу, который является «Array Out of Bound Write» (потому что m_cMessageCB имеет ширину всего 1 байт), и его поведение не определено. Это может закончиться при следующей записи или любой другой будущей записи.
Эти строки кажутся одной из проблем с этим кодом:
if(firstInstance == 0){
m_posRead = 0;//only on first instance
m_posWrite = 0;//only on first instance
Почему вы инициализируете индексы только в первом случае? В других случаях эти члены будут неинициализированы, поэтому очевидно, что они могут испортить память.
РЕДАКТИРОВАТЬ (относительно комментария):
Хорошо, вы можете сделать их статичными, однако это показывает серьезную проблему с вашим дизайном. Но это не по теме здесь. После того, как вы сделаете их статическими, остается еще одна проблема: переменная m_posWrite только увеличивается и никогда не сбрасывается / уменьшается — как вы ожидаете, что она не выйдет за пределы?