Круговая запись в буфер случайным образом завершает программу?

«Программа неожиданно завершилась».

У меня есть класс, который звонит 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
}

-1

Решение

Какой бы код вы ни предоставили, кажется, это явный случай повреждения памяти

Первый

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 байт), и его поведение не определено. Это может закончиться при следующей записи или любой другой будущей записи.

0

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

Эти строки кажутся одной из проблем с этим кодом:

if(firstInstance == 0){
m_posRead = 0;//only on first instance
m_posWrite = 0;//only on first instance

Почему вы инициализируете индексы только в первом случае? В других случаях эти члены будут неинициализированы, поэтому очевидно, что они могут испортить память.

РЕДАКТИРОВАТЬ (относительно комментария):

Хорошо, вы можете сделать их статичными, однако это показывает серьезную проблему с вашим дизайном. Но это не по теме здесь. После того, как вы сделаете их статическими, остается еще одна проблема: переменная m_posWrite только увеличивается и никогда не сбрасывается / уменьшается — как вы ожидаете, что она не выйдет за пределы?

0