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/

Reply via email to