I've got a routine that builds a big ol' string by looping through a bunch
of records and then loads it to a field as seen below.  Works great, but
gives me a big ol' memory leak and I can't seem to see why.  I assign a
chunk of non-moveable memory to logP using MemPtrNew, then I use MemPtrFree
to free it after I've copied the string to the field handle.  My POSE log
shows that I have one memory leak with the contents being that big ol'
string.  I'm wondering if maybe it's the field that's leaking the memory
somehow.  It's in a modal form that I bring up using FrmPopupForm() and
FrmReturnToForm().  Doesn't the system dispose of that memory, though?

Here's the abridged version of my code, which hopefully captures what I'm
doing wrong:

static void LogLoadRecord(void)
{
    Char *logP;
    ...
    field = GetObjectPtr(LogField);
    logP = (Char *)MemPtrNew(MAX_LOG_SIZE);
    ...
    // here I'm looping through a bunch of records and
    // doing StrCopy and StrCat to build the string.
    // POSE isn't logging any leaks of memory used here
    // as far as I can tell.
    ...
    error = SetFieldTextFromStr(field, logP);
    ...
    MemPtrFree((MemPtr) logP); // <-- The string pointed
    // to by logP is what is shown in the memory dump.
}

Here's the routine called for setting the field text.
I use this all the time (but with error checking that
I've left out for clarity):

Err SetFieldTextFromStr(FieldPtr field, const Char *s)
{
    MemHandle      h;

    h = FldGetTextHandle(field);
    if (h) {
       FldSetTextHandle(field, NULL);
       err = MemHandleResize(h, StrLen(s) + 1);
    } else {
        h = MemHandleNew(StrLen(s) + 1);
    }
    StrCopy((Char *) MemHandleLock(h), s);
    MemHandleUnlock(h);
    FldSetTextHandle(field, h);
    return errNone;
}

TIA for any help with this!
David



-- 
For information on using the Palm Developer Forums, or to unsubscribe, please see 
http://www.palmos.com/dev/support/forums/

Reply via email to