diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 0d52b93..027367c 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -167,6 +167,9 @@ import testing ; [ run shared_from_raw_test3.cpp ] [ run shared_from_raw_test4.cpp ] [ run shared_from_raw_test5.cpp ] + [ run shared_from_raw_test6.cpp ] + [ run weak_from_raw_test.cpp ] + [ run weak_from_raw_test2.cpp ] ; } diff --git a/test/shared_from_raw_test6.cpp b/test/shared_from_raw_test6.cpp new file mode 100644 index 0000000..d1941c6 --- /dev/null +++ b/test/shared_from_raw_test6.cpp @@ -0,0 +1,52 @@ +// +// shared_from_raw_test6 +// +// Tests that dangling shared_ptr instances are caught by +// the BOOST_ASSERT in ~enable_shared_from_raw +// +// Copyright 2014 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +// + +#define BOOST_ENABLE_ASSERT_HANDLER +#include +#include +#include +#include + +static int assertion_failed_ = 0; + +namespace boost +{ + +void assertion_failed( char const * expr, char const * function, char const * file, long line ) +{ + printf( "Assertion '%s' failed in function '%s', file '%s', line %ld\n", expr, function, file, line ); + ++assertion_failed_; +} + +} // namespace boost + +class X: public boost::enable_shared_from_raw +{ +}; + +int main() +{ + boost::shared_ptr px; + + { + X x; + px = boost::shared_from_raw( &x ); + } + + BOOST_TEST_EQ( assertion_failed_, 1 ); + + // px is a dangling pointer here + + return boost::report_errors(); +} diff --git a/test/weak_from_raw_test2.cpp b/test/weak_from_raw_test2.cpp new file mode 100644 index 0000000..c1da6f0 --- /dev/null +++ b/test/weak_from_raw_test2.cpp @@ -0,0 +1,67 @@ +// +// weak_from_raw_test2.cpp +// +// Test that weak_from_raw returns consistent values +// throughout the object lifetime +// +// Copyright (c) 2014 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +// + +#include +#include +#include + +class X; + +static boost::weak_ptr< X > r_; + +void register_( boost::weak_ptr< X > const & r ) +{ + r_ = r; +} + +void check_( boost::weak_ptr< X > const & r ) +{ + BOOST_TEST( !( r < r_ ) && !( r_ < r ) ); +} + +void unregister_( boost::weak_ptr< X > const & r ) +{ + BOOST_TEST( !( r < r_ ) && !( r_ < r ) ); + r_.reset(); +} + +class X: public boost::enable_shared_from_raw +{ +public: + + X() + { + register_( boost::shared_from_raw( this ) ); + } + + ~X() + { + unregister_( boost::weak_from_raw( this ) ); + } + + void check() + { + check_( boost::weak_from_raw( this ) ); + } +}; + +int main() +{ + { + boost::shared_ptr< X > px( new X ); + px->check(); + } + + return boost::report_errors(); +}