# New Ticket Created by chromatic # Please include the string: [perl #44499] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=44499 >
The string_from_cstring() function has a slight flaw, in that it has to allocate a piece of memory and create a C-style string from a nice happy STRING. It's the responsibility of the caller to discard the C string appropriately. This is tricky if that string immediately gets passed to real_exception() or some other C function which does not return control; there's no chance to free the string with string_cstring_free(). One solution is to use pointer tagging to mark pointers passed to real_exception() and the like as freeable. However, that means scanning them and getting their types right with regard to varargs and ow the hurting. Another option is to cache the C string in the STRING structure itself in the same way that Perl 5 caches IVs and NVs and PVs in the SV structure. (If that doesn't mean anything to you, congratulations. I have this little throbbing right behind my left eyeball just typing that.) In other words, pin the lifetime of the malloced memory to the lifetime of a garbage collected entity. Obviously it's necessary to free the C string when destroying the string (that's the point!) and it's necessary to free it and NULL out the pointer when the string's contents change, but this would get rid of a memory leak and, in the case of strings often converted to C strings, could improve performance. (It also simplifies a problem in certain NCI calls that I really don't want to get into.) Though I hate to admit it, I think one of the pointers in the the PObj union might work for this. -- c