--- author: '' category: '' date: 2007/03/13 11:04 description: '' link: '' priority: '' slug: P479 tags: RaSPF, programming, spf title: RaSPF on its way to release type: text updated: 2007/03/13 11:04 url_type: '' --- I have been able to work some more on RaSPF_ and the results are encouraging. Thanks to valgrind and test suites, I am pretty confident it doesn't leak memory, or at least, that it doesn't leak except on very rare cases. I think I found a neat way to simplify memory management, though, and that's what I wanted to mention. This is probably trivial for everyone reading, but I am a limited C programmer, so whenever something works unexpectedly right, I am happy ;-) One problem with C memory management is that if you have many exit points for your functions, releasing everything you allocate is rather annoying, since you may have to do it in several different locations. I compounded this problem because I am using exceptions (yeah, C doesn't have them. I used this_). Now not only do I have my returns but also my throws and whatever uncaught throw something I called has! Hell, right? Nope: what exceptions complicated, exceptions fixed. Look at this function: .. code-block:: CPP bstring spf_query_get_explanation(spf_query *q, bstring spec) { bstring txt=0; struct bstrList *l=0; bstring expanded=0; bstring result=0; struct tagbstring s=bsStatic(""); try { // Expand an explanation if (spec && spec->slen) { expanded=spf_query_expand(q,spec,1); l=spf_query_dns_txt(q,expanded); if (l) { txt=bjoin(l,&s); } else { txt=bfromcstr(""); } result=spf_query_expand(q,txt,0); throw(EXC_OK,0); } else { result=bfromcstr("explanation: Required option is missing"); throw(EXC_OK,0); } } except { if(expanded) bdestroy(expanded); if(txt) bdestroy(txt); if(l) bstrListDestroy(l); on (EXC_OK) { return result; } if(result) bdestroy(result); throw(EXCEPTION.type,EXCEPTION.param1); } } It doesn't matter if spf_query_expand or spf_query_dns_txt throw an exception, this will not leak. Nice, I think :-) .. _this: http://adomas.org/excc/ .. _raspf: http://code.google.com/p/raspf