Boost logo

Boost :

Subject: Re: [boost] unique_ptr for C++03
From: Andrew Ho (helloworld922_at_[hidden])
Date: 2013-08-03 14:39:38


> I would be very interested in seeing a C++03 based unique_ptr as part of
> Boost.SmartPtr
>
> Back in March there was some discussion about moving the unique_ptr
> implementation of Boost.Interprocess to Boost.SmartPtr. What happened
> to that proposal?

I actually didn't know Boost.Interprocess existed before. The interface
looks very similar to standard c++11 unique_ptr, and if it matches the
standard implementation as closely as possible, it would probably be a
better fit because the implementation is likely to be less buggy.

> Maybe you could use the safe-bool idiom.

Ah, thanks. Updated to use the safe-bool idiom.

>
> PS: I recommend that you use your real name in the copyright line rather
> than your handle. I do not think that the latter is legally valid.
>

Fair enough. Updated copywrite info.

Does anyone know of nullptr emulated type already in Boost (similar to
http://stackoverflow.com/a/8747659/558546)?

I think this would be the best way to allow this:

my_uptr = nullptr; // effectively my_uptr.reset();
if(my_uptr == nullptr) // technically valid, though not sure if there's
significant gains from verbose writing vs. if(my_uptr)

I did some testing trying to store my unique_ptr implementation into a
std::vector, and things did not go well using a C++03 compiler (standard
library templates obviously aren't move aware in C++03). I'm not sure
there's any way to fix this for C++03 without re-implementing the standard
library containers, which really isn't practical.

I think this implementation does work properly with array types.

// on p1 destruction, delete[] is called, as expected
boost::unique_ptr<int[]> p1(new int[2]);

// compilation error, as expected
boost::unique_ptr<int> p2 = boost::move(p1);

// compiles, but so does std::unique_ptr
// both will produce undefined runtime behavior on destruction of held value
// dunno if this is GCC-4.8.1 specific, or if technically allowed by the
standard and is user error.
boost::unique_ptr<int> p3(new int[2]);


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