shared_ptr_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 2,927 行 · 第 1/5 页

CPP
2,927
字号
        BOOST_TEST(pi4.use_count() == pi2.use_count());        BOOST_TEST(!(pi2 < pi4 || pi4 < pi2)); // shared ownership test        BOOST_TEST(pi3.use_count() == pi4.use_count());        BOOST_TEST(!(pi3 < pi4 || pi4 < pi3)); // shared ownership test    }    {        boost::shared_ptr<X> px(static_cast<X*>(0));        boost::shared_ptr<X> px2(px);        BOOST_TEST(px2 == px);        BOOST_TEST(px2? false: true);        BOOST_TEST(!px2);        BOOST_TEST(px2.get() == 0);        BOOST_TEST(px2.use_count() == 2);        BOOST_TEST(!px2.unique());        BOOST_TEST(px2.use_count() == px.use_count());        BOOST_TEST(!(px < px2 || px2 < px)); // shared ownership test        boost::shared_ptr<void> px3(px);        BOOST_TEST(px3 == px);        BOOST_TEST(px3? false: true);        BOOST_TEST(!px3);        BOOST_TEST(px3.get() == 0);        BOOST_TEST(px3.use_count() == 3);        BOOST_TEST(!px3.unique());        BOOST_TEST(px3.use_count() == px.use_count());        BOOST_TEST(!(px < px3 || px3 < px)); // shared ownership test        boost::shared_ptr<void> px4(px2);        BOOST_TEST(px4 == px2);        BOOST_TEST(px4? false: true);        BOOST_TEST(!px4);        BOOST_TEST(px4.get() == 0);        BOOST_TEST(px4.use_count() == 4);        BOOST_TEST(!px4.unique());        BOOST_TEST(px4.use_count() == px2.use_count());        BOOST_TEST(!(px2 < px4 || px4 < px2)); // shared ownership test        BOOST_TEST(px3.use_count() == px4.use_count());        BOOST_TEST(!(px3 < px4 || px4 < px3)); // shared ownership test    }    {        int * p = new int(7);        boost::shared_ptr<int> pi(p);        boost::shared_ptr<int> pi2(pi);        BOOST_TEST(pi2 == pi);        BOOST_TEST(pi2? true: false);        BOOST_TEST(!!pi2);        BOOST_TEST(pi2.get() == p);        BOOST_TEST(pi2.use_count() == 2);        BOOST_TEST(!pi2.unique());        BOOST_TEST(*pi2 == 7);        BOOST_TEST(pi2.use_count() == pi.use_count());        BOOST_TEST(!(pi < pi2 || pi2 < pi)); // shared ownership test    }    {        int * p = new int(7);        boost::shared_ptr<void> pv(p);        BOOST_TEST(pv.get() == p);        boost::shared_ptr<void> pv2(pv);        BOOST_TEST(pv2 == pv);        BOOST_TEST(pv2? true: false);        BOOST_TEST(!!pv2);        BOOST_TEST(pv2.get() == p);        BOOST_TEST(pv2.use_count() == 2);        BOOST_TEST(!pv2.unique());        BOOST_TEST(pv2.use_count() == pv.use_count());        BOOST_TEST(!(pv < pv2 || pv2 < pv)); // shared ownership test    }    BOOST_TEST(X::instances == 0);    {        X * p = new X;        boost::shared_ptr<X> px(p);        BOOST_TEST(px.get() == p);        boost::shared_ptr<X> px2(px);        BOOST_TEST(px2 == px);        BOOST_TEST(px2? true: false);        BOOST_TEST(!!px2);        BOOST_TEST(px2.get() == p);        BOOST_TEST(px2.use_count() == 2);        BOOST_TEST(!px2.unique());        BOOST_TEST(X::instances == 1);        BOOST_TEST(px2.use_count() == px.use_count());        BOOST_TEST(!(px < px2 || px2 < px)); // shared ownership test        boost::shared_ptr<void> px3(px);        BOOST_TEST(px3 == px);        BOOST_TEST(px3? true: false);        BOOST_TEST(!!px3);        BOOST_TEST(px3.get() == p);        BOOST_TEST(px3.use_count() == 3);        BOOST_TEST(!px3.unique());        BOOST_TEST(px3.use_count() == px.use_count());        BOOST_TEST(!(px < px3 || px3 < px)); // shared ownership test        boost::shared_ptr<void> px4(px2);        BOOST_TEST(px4 == px2);        BOOST_TEST(px4? true: false);        BOOST_TEST(!!px4);        BOOST_TEST(px4.get() == p);        BOOST_TEST(px4.use_count() == 4);        BOOST_TEST(!px4.unique());        BOOST_TEST(px4.use_count() == px2.use_count());        BOOST_TEST(!(px2 < px4 || px4 < px2)); // shared ownership test        BOOST_TEST(px3.use_count() == px4.use_count());        BOOST_TEST(!(px3 < px4 || px4 < px3)); // shared ownership test    }    BOOST_TEST(X::instances == 0);    BOOST_TEST(Y::instances == 0);    {        Y * p = new Y;        boost::shared_ptr<Y> py(p);        BOOST_TEST(py.get() == p);        boost::shared_ptr<X> px(py);        BOOST_TEST(px == py);        BOOST_TEST(px? true: false);        BOOST_TEST(!!px);        BOOST_TEST(px.get() == p);        BOOST_TEST(px.use_count() == 2);        BOOST_TEST(!px.unique());        BOOST_TEST(px.use_count() == py.use_count());        BOOST_TEST(!(px < py || py < px)); // shared ownership test        BOOST_TEST(X::instances == 1);        BOOST_TEST(Y::instances == 1);        boost::shared_ptr<void const> pv(px);        BOOST_TEST(pv == px);        BOOST_TEST(pv? true: false);        BOOST_TEST(!!pv);        BOOST_TEST(pv.get() == px.get());        BOOST_TEST(pv.use_count() == 3);        BOOST_TEST(!pv.unique());        BOOST_TEST(pv.use_count() == px.use_count());        BOOST_TEST(!(px < pv || pv < px)); // shared ownership test        boost::shared_ptr<void const> pv2(py);        BOOST_TEST(pv2 == py);        BOOST_TEST(pv2? true: false);        BOOST_TEST(!!pv2);        BOOST_TEST(pv2.get() == py.get());        BOOST_TEST(pv2.use_count() == 4);        BOOST_TEST(!pv2.unique());        BOOST_TEST(pv2.use_count() == py.use_count());        BOOST_TEST(!(py < pv2 || pv2 < py)); // shared ownership test        BOOST_TEST(pv.use_count() == pv2.use_count());        BOOST_TEST(!(pv < pv2 || pv2 < pv)); // shared ownership test    }    BOOST_TEST(X::instances == 0);    BOOST_TEST(Y::instances == 0);}void weak_ptr_constructor(){    {        boost::weak_ptr<Y> wp;        BOOST_TEST(wp.use_count() == 0);        try        {            boost::shared_ptr<Y> p2(wp);            BOOST_ERROR("shared_ptr<Y> p2(wp) failed to throw");        }        catch(boost::bad_weak_ptr)        {        }        try        {            boost::shared_ptr<X> p3(wp);            BOOST_ERROR("shared_ptr<X> p3(wp) failed to throw");        }        catch(boost::bad_weak_ptr)        {        }    }    {        boost::shared_ptr<Y> p;        boost::weak_ptr<Y> wp(p);        if(wp.use_count() != 0) // 0 allowed but not required        {            boost::shared_ptr<Y> p2(wp);            BOOST_TEST(p2.use_count() == wp.use_count());            BOOST_TEST(p2.get() == 0);            boost::shared_ptr<X> p3(wp);            BOOST_TEST(p3.use_count() == wp.use_count());            BOOST_TEST(p3.get() == 0);        }    }    {        boost::shared_ptr<Y> p(new Y);        boost::weak_ptr<Y> wp(p);        {            boost::shared_ptr<Y> p2(wp);            BOOST_TEST(p2? true: false);            BOOST_TEST(!!p2);            BOOST_TEST(p2.get() == p.get());            BOOST_TEST(p2.use_count() == 2);            BOOST_TEST(!p2.unique());            BOOST_TEST(p2.use_count() == wp.use_count());            BOOST_TEST(p.use_count() == p2.use_count());            BOOST_TEST(!(p < p2 || p2 < p)); // shared ownership test            boost::shared_ptr<X> p3(wp);            BOOST_TEST(p3? true: false);            BOOST_TEST(!!p3);            BOOST_TEST(p3.get() == p.get());            BOOST_TEST(p3.use_count() == 3);            BOOST_TEST(!p3.unique());            BOOST_TEST(p3.use_count() == wp.use_count());            BOOST_TEST(p.use_count() == p3.use_count());        }        p.reset();        BOOST_TEST(wp.use_count() == 0);        try        {            boost::shared_ptr<Y> p2(wp);            BOOST_ERROR("shared_ptr<Y> p2(wp) failed to throw");        }        catch(boost::bad_weak_ptr)        {        }        try        {            boost::shared_ptr<X> p3(wp);            BOOST_ERROR("shared_ptr<X> p3(wp) failed to throw");        }        catch(boost::bad_weak_ptr)        {        }    }}#if defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB < 306)#  define BOOST_OLD_AUTO_PTR#endifvoid auto_ptr_constructor(){    {        std::auto_ptr<int> p;        boost::shared_ptr<int> pi(p);        BOOST_TEST(pi? false: true);        BOOST_TEST(!pi);        BOOST_TEST(pi.get() == 0);        BOOST_TEST(pi.use_count() == 1);        BOOST_TEST(pi.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<int> p;        boost::shared_ptr<int const> pi(p);        BOOST_TEST(pi? false: true);        BOOST_TEST(!pi);        BOOST_TEST(pi.get() == 0);        BOOST_TEST(pi.use_count() == 1);        BOOST_TEST(pi.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<int> p;        boost::shared_ptr<void> pv(p);        BOOST_TEST(pv? false: true);        BOOST_TEST(!pv);        BOOST_TEST(pv.get() == 0);        BOOST_TEST(pv.use_count() == 1);        BOOST_TEST(pv.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<int> p;        boost::shared_ptr<void const> pv(p);        BOOST_TEST(pv? false: true);        BOOST_TEST(!pv);        BOOST_TEST(pv.get() == 0);        BOOST_TEST(pv.use_count() == 1);        BOOST_TEST(pv.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<X> p;        boost::shared_ptr<X> px(p);        BOOST_TEST(px? false: true);        BOOST_TEST(!px);        BOOST_TEST(px.get() == 0);        BOOST_TEST(px.use_count() == 1);        BOOST_TEST(px.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<X> p;        boost::shared_ptr<X const> px(p);        BOOST_TEST(px? false: true);        BOOST_TEST(!px);        BOOST_TEST(px.get() == 0);        BOOST_TEST(px.use_count() == 1);        BOOST_TEST(px.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<Y> p;        boost::shared_ptr<X> px(p);        BOOST_TEST(px? false: true);        BOOST_TEST(!px);        BOOST_TEST(px.get() == 0);        BOOST_TEST(px.use_count() == 1);        BOOST_TEST(px.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<Y> p;        boost::shared_ptr<X const> px(p);        BOOST_TEST(px? false: true);        BOOST_TEST(!px);        BOOST_TEST(px.get() == 0);        BOOST_TEST(px.use_count() == 1);        BOOST_TEST(px.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<Y> p;        boost::shared_ptr<void> pv(p);        BOOST_TEST(pv? false: true);        BOOST_TEST(!pv);        BOOST_TEST(pv.get() == 0);        BOOST_TEST(pv.use_count() == 1);        BOOST_TEST(pv.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<Y> p;        boost::shared_ptr<void const> pv(p);        BOOST_TEST(pv? false: true);        BOOST_TEST(!pv);        BOOST_TEST(pv.get() == 0);        BOOST_TEST(pv.use_count() == 1);        BOOST_TEST(pv.unique());        BOOST_TEST(p.get() == 0);    }    {        std::auto_ptr<int> p(new int(7));        int * q = p.get();        boost::shared_ptr<int> pi(p);        BOOST_TEST(pi? true: false);        BOOST_TEST(!!pi);        BOOST_TEST(pi.get() == q);        BOOST_TEST(pi.use_count() == 1);        BOOST_TEST(pi.unique());        BOOST_TEST(*pi == 7);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    {        std::auto_ptr<int> p(new int(7));        int * q = p.get();        boost::shared_ptr<int const> pi(p);        BOOST_TEST(pi? true: false);        BOOST_TEST(!!pi);        BOOST_TEST(pi.get() == q);        BOOST_TEST(pi.use_count() == 1);        BOOST_TEST(pi.unique());        BOOST_TEST(*pi == 7);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    {        std::auto_ptr<int> p(new int(7));        int * q = p.get();        boost::shared_ptr<void> pv(p);        BOOST_TEST(pv? true: false);        BOOST_TEST(!!pv);        BOOST_TEST(pv.get() == q);        BOOST_TEST(pv.use_count() == 1);        BOOST_TEST(pv.unique());#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    {        std::auto_ptr<int> p(new int(7));        int * q = p.get();        boost::shared_ptr<void const> pv(p);        BOOST_TEST(pv? true: false);        BOOST_TEST(!!pv);        BOOST_TEST(pv.get() == q);        BOOST_TEST(pv.use_count() == 1);        BOOST_TEST(pv.unique());#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    BOOST_TEST(X::instances == 0);    {        std::auto_ptr<X> p(new X);        X * q = p.get();        boost::shared_ptr<X> px(p);        BOOST_TEST(px? true: false);        BOOST_TEST(!!px);        BOOST_TEST(px.get() == q);        BOOST_TEST(px.use_count() == 1);        BOOST_TEST(px.unique());        BOOST_TEST(X::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    BOOST_TEST(X::instances == 0);    {        std::auto_ptr<X> p(new X);        X * q = p.get();        boost::shared_ptr<X const> px(p);        BOOST_TEST(px? true: false);        BOOST_TEST(!!px);        BOOST_TEST(px.get() == q);        BOOST_TEST(px.use_count() == 1);        BOOST_TEST(px.unique());        BOOST_TEST(X::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    BOOST_TEST(X::instances == 0);    {        std::auto_ptr<X> p(new X);        X * q = p.get();        boost::shared_ptr<void> pv(p);        BOOST_TEST(pv? true: false);        BOOST_TEST(!!pv);        BOOST_TEST(pv.get() == q);        BOOST_TEST(pv.use_count() == 1);        BOOST_TEST(pv.unique());        BOOST_TEST(X::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    BOOST_TEST(X::instances == 0);    {        std::auto_ptr<X> p(new X);        X * q = p.get();        boost::shared_ptr<void const> pv(p);        BOOST_TEST(pv? true: false);        BOOST_TEST(!!pv);        BOOST_TEST(pv.get() == q);        BOOST_TEST(pv.use_count() == 1);        BOOST_TEST(pv.unique());        BOOST_TEST(X::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    BOOST_TEST(X::instances == 0);    BOOST_TEST(Y::instances == 0);    {        std::auto_ptr<Y> p(new Y);        Y * q = p.get();        boost::shared_ptr<X> px(p);        BOOST_TEST(px? true: false);        BOOST_TEST(!!px);        BOOST_TEST(px.get() == q);        BOOST_TEST(px.use_count() == 1);        BOOST_TEST(px.unique());        BOOST_TEST(X::instances == 1);        BOOST_TEST(Y::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    BOOST_TEST(X::instances == 0);    BOOST_TEST(Y::instances == 0);    {        std::auto_ptr<Y> p(new Y);        Y * q = p.get();        boost::shared_ptr<X const> px(p);        BOOST_TEST(px? true: false);        BOOST_TEST(!!px);        BOOST_TEST(px.get() == q);        BOOST_TEST(px.use_count() == 1);        BOOST_TEST(px.unique());        BOOST_TEST(X::instances == 1);        BOOST_TEST(Y::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR)        BOOST_TEST(p.get() == 0);#endif    }    BOOST_TEST(X::instances == 0);    BOOST_TEST(Y::instances == 0);}void test(){    default_constructor();    pointer_constructor();    deleter_constructor();    copy_constructor();    weak_ptr_constructor();    auto_ptr_constructor();}} // namespace n_constructorsnamespace n_assignment{class incomplete;struct A{    int dummy;};struct X{    static long instances;    X()    {        ++instances;    }    ~X()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?