📄 shared_ptr_test.cpp
字号:
{
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_constructors
namespace n_assignment
{
class incomplete;
struct A
{
int dummy;
};
struct X
{
static long instances;
X()
{
++instances;
}
~X()
{
--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_assignment
namespace 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::shared_ptr<int> pi(static_cast<int*>(0));
pi.reset();
BOOST_TEST(pi? false: true);
BOOST_TEST(!pi);
BOOST_TEST(pi.get() == 0);
}
{
boost::shared_ptr<int> pi(new int);
pi.reset();
BOOST_TEST(pi? false: true);
BOOST_TEST(!pi);
BOOST_TEST(pi.get() == 0);
}
{
boost::shared_ptr<incomplete> px;
px.reset();
BOOST_TEST(px? false: true);
BOOST_TEST(!px);
BOOST_TEST(px.get() == 0);
}
{
boost::shared_ptr<incomplete> px(p0, deleter);
px.reset();
BOOST_TEST(px? false: true);
BOOST_TEST(!px);
BOOST_TEST(px.get() == 0);
}
{
boost::shared_ptr<X> px;
px.reset();
BOOST_TEST(px? false: true);
BOOST_TEST(!px);
BOOST_TEST(px.get() == 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(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(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(X::instances == 0);
}
}
struct A
{
int dummy;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -