From: | Stephen Woodbridge <woodbri(at)swoodbridge(dot)com> |
---|---|
To: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: Do I have to free storage in a UDF if I raise an error? |
Date: | 2014-01-06 15:46:02 |
Message-ID: | 52CACFBA.8030509@swoodbridge.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On 1/6/2014 10:00 AM, Pfuntner, John wrote:
> If I've done a palloc() to get storage inside a user-defined function and raise an error using ereport(), should I be using pfree() to release the storage before the ereport()?
>
> Consider this example in C:
>
> PG_FUNCTION_INFO_V1(Example);
> Datum
> Example(PG_FUNCTION_ARGS) {
> VarChar* pstring=PG_GETARG_VARCHAR_P(0);
> VarChar* ret=NULL;
>
> int len = VARSIZE(pstring) - VARHDRSZ;
> char *string=palloc(len+1);
> memcpy(string, VARDATA(pstring), len);
> string[len] = '\0';
>
> /* ... */
>
> if ( /* some bad condition */ ) {
> ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), errmsg("some bad condition occurred!")));
> }
>
> /* ... */
>
> pfree(string);
>
> if (ret == NULL)
> PG_RETURN_NULL();
> else
> PG_RETURN_VARCHAR_P(ret);
> }
>
> I only have the pfree() at the end before the return if there is no error. If I fail to call pfree() before ereport(), do I have a memory leak?
No, this is why it is important to use palloc and malloc.
-Steve
From | Date | Subject | |
---|---|---|---|
Next Message | Adrian Klaver | 2014-01-06 16:17:37 | Re: WAL archive cleanup om master |
Previous Message | David Johnston | 2014-01-06 15:42:14 | Re: Planning error in dynamic string creation in plpgsql |