shared_ptr_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 2,927 行 · 第 1/5 页
CPP
2,927 行
{ --instances; }private: X(X const &); X & operator= (X const &);};long X::instances = 0;struct Y: public A, public virtual X{ static long instances; Y() { ++instances; } ~Y() { --instances; }private: Y(Y const &); Y & operator= (Y const &);};long Y::instances = 0;void copy_assignment(){ { boost::shared_ptr<incomplete> p1; p1 = p1; BOOST_TEST(p1 == p1); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); boost::shared_ptr<incomplete> p2; p1 = p2; BOOST_TEST(p1 == p2); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); boost::shared_ptr<incomplete> p3(p1); p1 = p3; BOOST_TEST(p1 == p3); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); } { boost::shared_ptr<void> p1; p1 = p1; BOOST_TEST(p1 == p1); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); boost::shared_ptr<void> p2; p1 = p2; BOOST_TEST(p1 == p2); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); boost::shared_ptr<void> p3(p1); p1 = p3; BOOST_TEST(p1 == p3); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); boost::shared_ptr<void> p4(new int); BOOST_TEST(p4.use_count() == 1); p1 = p4; BOOST_TEST(p1 == p4); BOOST_TEST(!(p1 < p4 || p4 < p1)); BOOST_TEST(p1.use_count() == 2); BOOST_TEST(p4.use_count() == 2); p1 = p3; BOOST_TEST(p1 == p3); BOOST_TEST(p4.use_count() == 1); } { boost::shared_ptr<X> p1; p1 = p1; BOOST_TEST(p1 == p1); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); boost::shared_ptr<X> p2; p1 = p2; BOOST_TEST(p1 == p2); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); boost::shared_ptr<X> p3(p1); p1 = p3; BOOST_TEST(p1 == p3); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); BOOST_TEST(X::instances == 0); boost::shared_ptr<X> p4(new X); BOOST_TEST(X::instances == 1); p1 = p4; BOOST_TEST(X::instances == 1); BOOST_TEST(p1 == p4); BOOST_TEST(!(p1 < p4 || p4 < p1)); BOOST_TEST(p1.use_count() == 2); p1 = p2; BOOST_TEST(p1 == p2); BOOST_TEST(X::instances == 1); p4 = p3; BOOST_TEST(p4 == p3); BOOST_TEST(X::instances == 0); }}void conversion_assignment(){ { boost::shared_ptr<void> p1; boost::shared_ptr<incomplete> p2; p1 = p2; BOOST_TEST(p1 == p2); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); boost::shared_ptr<int> p4(new int); BOOST_TEST(p4.use_count() == 1); boost::shared_ptr<void> p5(p4); BOOST_TEST(p4.use_count() == 2); p1 = p4; BOOST_TEST(p1 == p4); BOOST_TEST(!(p1 < p5 || p5 < p1)); BOOST_TEST(p1.use_count() == 3); BOOST_TEST(p4.use_count() == 3); p1 = p2; BOOST_TEST(p1 == p2); BOOST_TEST(p4.use_count() == 2); } { boost::shared_ptr<X> p1; boost::shared_ptr<Y> p2; p1 = p2; BOOST_TEST(p1 == p2); BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0); boost::shared_ptr<Y> p4(new Y); BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1); BOOST_TEST(p4.use_count() == 1); boost::shared_ptr<X> p5(p4); BOOST_TEST(p4.use_count() == 2); p1 = p4; BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1); BOOST_TEST(p1 == p4); BOOST_TEST(!(p1 < p5 || p5 < p1)); BOOST_TEST(p1.use_count() == 3); BOOST_TEST(p4.use_count() == 3); p1 = p2; BOOST_TEST(p1 == p2); BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1); BOOST_TEST(p4.use_count() == 2); p4 = p2; p5 = p2; BOOST_TEST(p4 == p2); BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0); }}void auto_ptr_assignment(){ { boost::shared_ptr<int> p1; std::auto_ptr<int> p2; p1 = p2; BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); BOOST_TEST(p1.use_count() == 1); int * p = new int; std::auto_ptr<int> p3(p); p1 = p3; BOOST_TEST(p1.get() == p); BOOST_TEST(p1.use_count() == 1);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p3.get() == 0);#endif p1 = p2; BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); BOOST_TEST(p1.use_count() == 1); } { boost::shared_ptr<void> p1; std::auto_ptr<int> p2; p1 = p2; BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); BOOST_TEST(p1.use_count() == 1); int * p = new int; std::auto_ptr<int> p3(p); p1 = p3; BOOST_TEST(p1.get() == p); BOOST_TEST(p1.use_count() == 1);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p3.get() == 0);#endif p1 = p2; BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); BOOST_TEST(p1.use_count() == 1); } { boost::shared_ptr<X> p1; std::auto_ptr<Y> p2; p1 = p2; BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); BOOST_TEST(p1.use_count() == 1); BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0); Y * p = new Y; std::auto_ptr<Y> p3(p); BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1); p1 = p3; BOOST_TEST(p1.get() == p); BOOST_TEST(p1.use_count() == 1); BOOST_TEST(X::instances == 1); BOOST_TEST(Y::instances == 1);#if !defined(BOOST_OLD_AUTO_PTR) BOOST_TEST(p3.get() == 0);#endif p1 = p2; BOOST_TEST(p1? false: true); BOOST_TEST(!p1); BOOST_TEST(p1.get() == 0); BOOST_TEST(p1.use_count() == 1); BOOST_TEST(X::instances == 0); BOOST_TEST(Y::instances == 0); }}void test(){ copy_assignment(); conversion_assignment(); auto_ptr_assignment();}} // namespace n_assignmentnamespace n_reset{class incomplete;incomplete * p0 = 0;void deleter(incomplete *){}struct X{ static long instances; X() { ++instances; } ~X() { --instances; }private: X(X const &); X & operator= (X const &);};long X::instances = 0;void plain_reset(){ { boost::shared_ptr<int> pi; pi.reset(); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 0); } { boost::shared_ptr<int> pi(static_cast<int*>(0)); pi.reset(); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 0); } { boost::shared_ptr<int> pi(new int); pi.reset(); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 0); } { boost::shared_ptr<incomplete> px; px.reset(); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 0); } { boost::shared_ptr<incomplete> px(p0, deleter); px.reset(); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 0); } { boost::shared_ptr<X> px; px.reset(); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 0); } { BOOST_TEST(X::instances == 0); boost::shared_ptr<X> px(new X); BOOST_TEST(X::instances == 1); px.reset(); BOOST_TEST(px? false: true); BOOST_TEST(!px); BOOST_TEST(px.get() == 0); BOOST_TEST(px.use_count() == 0); BOOST_TEST(X::instances == 0); } { boost::shared_ptr<void> pv; pv.reset(); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 0); } { BOOST_TEST(X::instances == 0); boost::shared_ptr<void> pv(new X); BOOST_TEST(X::instances == 1); pv.reset(); BOOST_TEST(pv? false: true); BOOST_TEST(!pv); BOOST_TEST(pv.get() == 0); BOOST_TEST(pv.use_count() == 0); BOOST_TEST(X::instances == 0); }}struct A{ int dummy;};struct Y: public A, public virtual X{ static long instances; Y() { ++instances; } ~Y() { --instances; }private: Y(Y const &); Y & operator= (Y const &);};long Y::instances = 0;void pointer_reset(){ { boost::shared_ptr<int> pi; pi.reset(static_cast<int*>(0)); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); int * p = new int; pi.reset(p); BOOST_TEST(pi? true: false); BOOST_TEST(!!pi); BOOST_TEST(pi.get() == p); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); pi.reset(static_cast<int*>(0)); BOOST_TEST(pi? false: true); BOOST_TEST(!pi); BOOST_TEST(pi.get() == 0); BOOST_TEST(pi.use_count() == 1); BOOST_TEST(pi.unique()); } { boost::shared_ptr<X> px; px.reset(static_cast<X*>(0)); 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(X::instances == 0); X * p = new X; px.reset(p); BOOST_TEST(px? true: false); BOOST_TEST(!!px); BOOST_TEST(px.get() == p); BOOST_TEST(px.use_count() == 1); BOOST_TEST(px.unique()); BOOST_TEST(X::instances == 1); px.reset(static_cast<X*>(0)); 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(X::instances == 0); BOOST_TEST(Y::instances == 0); Y * q = new Y; px.reset(q); 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); px.reset(static_cast<Y*>(0)); 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(X::instances == 0); BOOST_TEST(Y::instances == 0); } { boost::shared_ptr<void> pv;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?