I'm wanting a non-reference counted smart pointer that can combine some of the useful aspects of auto_ptr
and shared_ptr
. I think that C++0x's unique_ptr
is ultimately what I'd need, but I need something that will compile on Visual Studio 2008 and Xcode (gcc 4.2).
The functionality I need is:
release()
(like auto_ptr)So, I suppose it's really a better auto_ptr
. Is there anything that does this in boost or elsewhere (note: I haven't got the time to wrap my head around Loki)? Or should I just roll my own?
EDIT: I've just been reading more about auto_ptr
-- it sounds like you can use it with forward declarations if you ensure that the class header is included in each .cpp file that references the header with the smart pointer (eg see GotW). Anyone got any general advice or rules of thumb on this?
EDIT2: The reason shared_ptr isn't acceptable is because I need a release() method as I'm tidying up some legacy code by introducing factory methods, but it has to co-exist with some manual pointer ownership code. Using shared_ptr throughout the codebase would be great, but a huge task.
EDIT3: In the end, auto_ptr
was adequate for the job once I discovered the quirks of the forward inclusion. It would be interesting also to try writing a custom deleter for shared_ptr
to allow for optional deletion of the pointer.
Edit: In my original answer, I failed to understand that boost::shared_ptr
is not acceptable to you (probably for performance reasons).
auto_ptr
does, as you note, support forward declaration. You need to include the header for the referenced class in those places that may destroy the object referenced by the auto_ptr
. Note, however, that the semantics of auto_ptr
are slightly quirky and require some care.
The answers to the following question contain more information, including the reason why unique_ptr
can only be implemented for C++0x because it requires rvalue references:
unique_ptr boost equivalent?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With