Ramkumar Ramachandra wrote on Thu, Sep 23, 2010 at 01:12:52 +0530:
> Daniel Shahaf writes:
> > Choosing path=NULL to represent "the root" seems odd to me (that's not
> > how we usually represent it), but that's for another day.
> I think I'm using "" to represent the root somewhere, but I'll have to
> check this. I'll figure something out during the cleanup.
> > > True. However, abspath is a `char *` with no memory allocated to it: I
> > > want whatever its value is to be allocated in `pool` since it's passed
> > > around.
> > I think you've got your pointers confused. Can you drop the pstrdup(),
> > see that nothing breaks, and then we can discuss why nothing broke?
> Hehe, I wouldn't be surprised if this is the case -- I've been working
> with APR pools day and night now :p
> Okay, I'll drop this during the cleanup. Do explain this to me though :)
abspath is a pointer, lives on the stack, and is passed by value (like
any old int) in function calls. What you allocate from the pool is the
value it points to --- i.e., the two bytes of "/".
However, literal string constants are static strings --- they are loaded
into memory from the binary image (ever tried 'strings /usr/bin/svn'?)
and stay there until that is unloaded --- while pool-allocated strings
allocated on the heap, and stays there until the pool is cleared.
The other difference is that literal strings are not writable (they are
const char *) while pool-allocate strings are mutable (non-const char *).
So, the only reasons you'd have to duplicate a static string is if the
static string lives in a library which you know you'll unload or if
you need a non-const char * for some reason. In your case, 'abspath' is
a const char *, so neither of these cases applies.
(waiting to hear from you that dropping the strdup() causes a segfault)
 Thanks, dev@ archives.
Received on 2010-09-22 22:13:40 CEST