Boost logo

Boost :

From: Thorsten Ottosen (nesotto_at_[hidden])
Date: 2003-12-29 00:06:17


"Dan W." <danw_at_[hidden]> wrote in message
news:6.0.0.22.0.20031228215508.027e6a40_at_pcp.softhome.net...
> Sounds very interesting to me,

I'm glad to hear that :-)

>the couple of times I've tried using
> auto_ptr's as container elements I ran into so much trouble I just gave up
> and used plain pointers.

yeah, you would have to use something like NTL for that.

> It could only be complete with "ptr_hash_map<>" though (my favorite
> container :)

Several others have requested the hash_map too. I'll can add it very easily
once I can get a
hash_map from somewhere. Does anybody know the status of the boost hash_map?

> Questions:
> What happens if I inadvertently pass pointers to statically allocated
> objects, like const strings, to push_back(), or other input functions?

you're not allowed to do that. All pointers must be heap-allocated.

> Would it be safer for push_back(), say, to take a smart pointer as input?

in some sense yes. You're thinking about giving the user a hint about the
ownership semantics. However,
since the user could also pass the address of a stack object to the smart
pointer, we have only
moved the problem. Knowing that the containers take ownership is really
neccesary to use the containers
properly; we can't protect against malice.

> What if I *want* to use pointers to const strings, i.e.: *not* to be owned
> by the pointer container, but still enjoy its other conveniences?

I have thought about this for some time, but I have not reached a final
conclusion.
In your sepcial case of strings, there does not seem to be any reason for
the indirected semantics; one should
just stick to normal containers.

For normal pointers, however, non-ownership cannot be used currently,
because auto_ptrs can call delete on
pointers in various cases. So it would require a whole new interface:

void non_owning_insert( ... );
void non_owning_push_back( ... );

and also some mean to get rid of the delete in the containers destructor and
erase() which could be either
a delete_clone() hook or a remove_owneship() member function. On top of this
you must not forget
not to use the part of the interface that returns ownership.

So I think it is not worth supporting this. IT might also be better to make
a kind of proxy that can be used with
normal containers, but I haven't thought that through.

> And, should there be corresponding array_map<>, array_set<>,
etc.?; --i.e.:
> owning containers for elements requiring delete[] as opposed to delete?

Some have agued that this is the reason for having a delete hook like
delete_clone(). However,
it is much better just to use ptr_container< boost::array<X,size> > instead.

br

Thorsten


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk