// JP opened flex table

Click to See Complete Forum and Search --> : MEMORY PROBLEM, PLEASE HELP!


valus
December 26th, 2000, 03:40 AM
The problem is: I
have device, which sends 5 bytes every 500 ms so my computer recieved
5*120 bytes per minute and when I run my program it occupies in memory
1300KB and after two days it is 10000KB. Maybe I allocate memory and
don't release it, but I don't know where. Here is statement of OnOnCommMscomm() . Could someone help me please?

CString s_pom;
BYTE bajt[5];
char sprava[70];
char hexa[5][3];
char binval[5][9];
char binar[5][9];
time_t cas;
struct tm *p_cas;
BYTE den;
char pom[9];
int pocet;
VARIANT var;
COleSafeArray svar;
void* pSrc;
CListBox m_list;

void CDconnect::OnOnCommMscomm()
{
switch(m_ComPort.GetCommEvent())
{
case 2: //vbMSCommEvReceive
var = m_ComPort.GetInput();
svar = var;
svar.AccessData( &pSrc );
memcpy( &bajt, pSrc, 5*sizeof(BYTE) );
svar.UnaccessData();
for(b=0;b<5;b++)
for(b=0;b<5;b++){
_itoa( bajt[b], hexa[b], 16 );
_itoa( bajt[b], binval[b], 2 );
wsprintf(binar[b], "%s", Doplnosem(binval[b]));
}
kod++;
wsprintf(sprava, "%d%s%s%s%s%s%s%s%s%s%s%s",kod, -
",binar[0]," ", binar[1]," ", binar[2]," ", binar[3]," ", binar[4],"
");
m_list.AddString(sprava);
time(&cas);
s_pom += ctime(&cas);
strcpy(zaznam[poc_dat].time, ctime(&cas));
s_pom += " ";
wsprintf(sprava, "%s%s%s%s%s%s%s%s%s%s%s", " ",hexa[0],"H ",
hexa[1],"H ", hexa[2],"H ", hexa[3],"H ", hexa[4],"H ");
s_pom += sprava;
wsprintf(sprava, "%s%d%s%d%s%d%s%d%s%d%s", " ",bajt[0]," ",
bajt[1]," ", bajt[2]," ", bajt[3]," ", bajt[4]," ");
s_pom += sprava;
m_list.AddString(s_pom);
s_pom = "";
if(m_list.GetCount()>MAXPOCET){
m_list.DeleteString(1);
m_list.DeleteString(0);
}
pocet = m_list.GetCount();
m_list.SetCurSel(pocet-1); // select last row
p_cas = localtime( &cas );
if((BYTE)p_cas->tm_yday != den){
den = p_cas->tm_yday;
kod = 0;
}
break;
}//switch
}

char* CDconnect::Doplnosem(char* value)
{

switch(strlen(value))
{
case 8:
wsprintf(pom, "%s", value);
break;
case 7:
wsprintf(pom, "%s%s", "0",value);
break;
case 6:
wsprintf(pom, "%s%s", "00",value);
break;
case 5:
wsprintf(pom, "%s%s", "000",value);
break;
case 4:
wsprintf(pom, "%s%s", "0000",value);
break;
case 3:
wsprintf(pom, "%s%s", "00000",value);
break;
case 2:
wsprintf(pom, "%s%s", "000000",value);
break;
case 1:
wsprintf(pom, "%s%s", "0000000",value);
break;
case 0:
wsprintf(pom, "%s%s", "00000000",value);
break;
}
return pom;
}

Alex Fedotov
December 26th, 2000, 04:37 PM
These lines cause memory leak:

var = m_ComPort.GetInput();
svar = var;

Variant is copied here, but original value is never freed
anythere in your code. You can either add VarianClear call
below these lines:

var = m_ComPort.GetInput();
svar = var;
VariantClear(&var);

or remove var variable at all:

svar = m_ComPort.GetInput();

valus
December 27th, 2000, 12:51 PM
Thanks for your advice. I try it and then will write you if it works. Somebody write me that m_list.DeleteString() does not free memory so I exlude m_list.AddSring() method, but it did not help. So I hope you are right.

Best regards from Slovak

Valus

valus
December 27th, 2000, 06:58 PM
Hi,
I have tested it, but I think there is something else wrong in
programm, because within 1 hour memory increased from 3524K to 3804K.
It is 300K. Could you look at it please?

Best regards Valus

void CDconnect::OnOnCommMscomm()
> {
>
> // TODO: Add your control notification handler code here
> switch(m_ComPort.GetCommEvent())
> {
> case 2: //vbMSCommEvReceive
> svar = m_ComPort.GetInput();
> svar.AccessData( &pSrc );
> memcpy( &bajt, pSrc, 5*sizeof(BYTE) );
> svar.UnaccessData();
> svar.Clear();
> svar.DestroyData();
> for(b=0;b<5;b++){
> _itoa( bajt[b], hexa[b], 16 );
> _itoa( bajt[b], binval[b], 2 );
> wsprintf(binar[b], "%s", Doplnosem(binval[b]));//
> doplnenie nul do konca bajtu
> }
> kod++;
> wsprintf(sprava, "%d%s%s%s%s%s%s%s%s%s%s%s",kod, " -
> ",binar[0]," ", binar[1]," ", binar[2]," ", binar[3]," ", binar[4],"
> ");
> m_list.AddString(sprava);
> datetime = COleDateTime::GetCurrentTime();
> s_pom = datetime.Format("%H:%M:%S");
> s_pom += " ";
> wsprintf(sprava, "%s%s%s%s%s%s%s%s%s%s%s", " ",hexa[0],"H ",
> hexa[1],"H ", hexa[2],"H ", hexa[3],"H ", hexa[4],"H ");
> s_pom += sprava;
> wsprintf(sprava, "%s%d%s%d%s%d%s%d%s%d%s", " ",bajt[0],"
> ", bajt[1]," ", bajt[2]," ", bajt[3]," ", bajt[4]," ");
> s_pom += sprava;
> m_list.AddString(s_pom);
> s_pom = "";
> if(m_list.GetCount()>MAXPOCET){
> // m_list.DeleteString(1);
> // m_list.DeleteString(0);
> m_list.ResetContent();
> }
> pocet = m_list.GetCount();
> m_list.SetCurSel(pocet-1);
> datetime = COleDateTime::GetCurrentTime();
> if(datetime.GetDay() != den){
> den = datetime.GetDay();
> kod = 0;
> }
> break;
> }//switch
> }

Alex Fedotov
December 27th, 2000, 10:08 PM
I don't see any suspicious in the code. You might use some advanced
debugging tools such as NuMega BoundsChecker to help identify memory
leaks.

//JP added flex table