forked from boostorg/smart_ptr
Stricter tests; associated bug fixes. ;-)
[SVN r16369]
This commit is contained in:
@@ -140,8 +140,10 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
template<class Y>
|
template<class Y>
|
||||||
explicit shared_ptr(weak_ptr<Y> const & r): px(r.px), pn(r.pn) // may throw
|
explicit shared_ptr(weak_ptr<Y> const & r): pn(r.pn) // may throw
|
||||||
{
|
{
|
||||||
|
// it is now safe to copy r.px, as pn(r.pn) did not throw
|
||||||
|
px = r.px;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Y>
|
template<class Y>
|
||||||
@@ -166,7 +168,7 @@ public:
|
|||||||
template<class Y>
|
template<class Y>
|
||||||
shared_ptr(shared_ptr<Y> const & r, detail::polymorphic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)
|
shared_ptr(shared_ptr<Y> const & r, detail::polymorphic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)
|
||||||
{
|
{
|
||||||
if (px == 0)
|
if(px == 0)
|
||||||
{
|
{
|
||||||
boost::throw_exception(std::bad_cast());
|
boost::throw_exception(std::bad_cast());
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
|
#include <cstring> // for std::memcpy
|
||||||
|
|
||||||
#ifdef BOOST_MSVC // moved here to work around VC++ compiler crash
|
#ifdef BOOST_MSVC // moved here to work around VC++ compiler crash
|
||||||
# pragma warning(push)
|
# pragma warning(push)
|
||||||
# pragma warning(disable:4284) // odd return type for operator->
|
# pragma warning(disable:4284) // odd return type for operator->
|
||||||
@@ -42,8 +44,11 @@ public:
|
|||||||
// generated copy constructor, assignment, destructor are fine
|
// generated copy constructor, assignment, destructor are fine
|
||||||
|
|
||||||
template<class Y>
|
template<class Y>
|
||||||
weak_ptr(weak_ptr<Y> const & r): px(r.px), pn(r.pn) // never throws
|
weak_ptr(weak_ptr<Y> const & r): pn(r.pn) // never throws
|
||||||
{
|
{
|
||||||
|
// r.px may be an invalid pointer value
|
||||||
|
using namespace std;
|
||||||
|
memcpy(&this->px, &r.px, sizeof(r.px));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Y>
|
template<class Y>
|
||||||
|
@@ -99,7 +99,9 @@ private:
|
|||||||
|
|
||||||
long X::instances = 0;
|
long X::instances = 0;
|
||||||
|
|
||||||
struct Y: public A, public X
|
// virtual inheritance stresses the implementation
|
||||||
|
|
||||||
|
struct Y: public A, public virtual X
|
||||||
{
|
{
|
||||||
static long instances;
|
static long instances;
|
||||||
|
|
||||||
@@ -771,6 +773,11 @@ void weak_ptr_constructor()
|
|||||||
catch(boost::bad_weak_ptr)
|
catch(boost::bad_weak_ptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
boost::weak_ptr<Y> wp2(wp);
|
||||||
|
boost::weak_ptr<X> wp3(wp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void auto_ptr_constructor()
|
void auto_ptr_constructor()
|
||||||
|
Reference in New Issue
Block a user