To clarify, for Carlos's sake, what wasn't clear to me: Sigurd wants to be able to give Enqueue his strings and have the Queue take over ownership, where the present implementation makes a copy and he has to free() the original (wasteful heap traffic).  He would expect copy==NULL to be the way to express that.  However, support for COW (w/ reference-counting) implies a need to be able to copy (even though he'll never actually make a copy of his queue, shallow or otherwise, so copy would never actually be used outside Enqueue, where he doesn't want it).

Note that one possible fix for this would be: QueueCopy() is the one that objects vehemently if ->copy is NULL, we accept it here and Enqueue() treats it as meaning "take over ownership".