I think you problem is probably that you are performing the clean-up
portion in the wrong place. It should be executed in AppStop or
frmCloseEvent. What you can do is to have two global parameters
declared as follows:
static char **GprogramsArray
static UInt16 GnumItems
Then at the end of your frmNewM_trProg_OnSelect procedure you put
this:
GprogramsArray = programsArray;
GnumItems = numRec;
Then for you cleanup you just do:
for (i = GnumItems- 1; i >= 0; i--)
{
MemPtrFree(GprogramsArray[i]);
}
MemPtrFree(programsArray);
I think this should solve your problem.
> SK> "Boris Epshteyn" <[EMAIL PROTECTED]> wrote in message
> SK> news:[EMAIL PROTECTED]
> >>
> >> Hi,
> >>
> >> I have an interesting problem. I am allocating an array of
strings.
> >> This array is filled from the database and then used for
populating
> >> pop-up list. When program is ran, list pops up fine, item gets
> >> selected, but when I tap on the trigger again I get:
> >> "just read from the ... which is the reserved field of the
> >> frmControlObj," bla-bla-bla.
> >>
> >> If my clean-up portion of the code is commented out, everything
runs
> >> fine, but creates memory leaks. Clean-up portion is:
> >> for (i = numRec - 1; i >= 0; i--)
> >> {
> >> MemPtrFree(programsArray[i]);
> >> }
> >> MemPtrFree(programsArray);
> >>
> >> I would appreciate any ideas why it is happening. The code is
bellow:
> >>
> >>
> >> static Boolean frmNewM_trProg_OnSelect(EventPtr event)
> >> {
> >> ListType *list = GetObjectPtr(lstPrograms);
> >> Int16 listItem, cardNo;
> >> UInt32 numRec = 0;
> >> Err err;
> >> char** programsArray;
> >> MemHandle record;
> >> LocalID progLocID;
> >> Program* prog;
> >> int i;
> >> MemPtr ptr;
> >> err = DmOpenDatabaseInfo(progDB, &progLocID, NULL,
NULL,&cardNo,
> SK> NULL);
> >> if (progLocID != 0)
> >> {
> >> err = DmDatabaseSize(cardNo, progLocID, &numRec,
NULL, NULL);
> >> }
> >> programsArray = (char**)MemPtrNew(numRec * sizeof
(char*));
> >>
> >> for (i = 0; i < numRec; i++)
> >> {
> >> record = DmQueryRecord(progDB, (UInt16)i);
> >> if (record)
> >> {
> >> prog = (Program*)MemHandleLock(record);
> >> ptr = &prog->programName;
> >> programsArray[i] = (char*)MemPtrNew(StrLen(ptr) +
1 );
> >> StrCopy(programsArray[i], ptr);
> >> MemHandleUnlock(record);
> >> }
> >> }
> >> LstSetListChoices(list, programsArray, numRec);
> >> listItem = LstPopupList(list);
> >>
> >> if(listItem != -1)
> >> {
> >> ControlType *trg = GetObjectPtr(trProg);
> >> CtlSetLabel(trg, programsArray[listItem]);
> >> }
> >> for (i = numRec - 1; i >= 0; i--)
> >> {
> >> MemPtrFree(programsArray[i]);
> >> }
> >> MemPtrFree(programsArray);
> >> return true;
> >> }
> >>
> >>
> >>
> >>
> >> --
> >> Best regards,
> >> Boris mailto:[EMAIL PROTECTED]
> >>
> >>
> >>
>
>
>
>
> mailto:[EMAIL PROTECTED]
>
>
> --
> For information on using the Palm Developer Forums, or to
unsubscribe, please see http://www.palmos.com/dev/support/forums/
--
For information on using the Palm Developer Forums, or to unsubscribe, please see
http://www.palmos.com/dev/support/forums/