1.make_shared写法(1) 和 new对象后获取指针再初始化(2)
struct lifePeriod
{
lifePeriod():a(1)
{
cout << "无参构造!" << endl;
}
virtual ~lifePeriod()
{
cout << "析构!" << endl;
}
lifePeriod(const lifePeriod& d)
{
cout << "有参构造!" << endl;
}
int a;
};
int main()
{
{
cout << "----------------开始-------------------" << endl;
//unique_ptr 不允许被复制,但是可以通过函数返回给其他的 unique_ptr,还可以通过 move() 转移给其他的 unique_ptr。
//还是一个 unique_ptr 独占一个地址
lifePeriod lifeT;
unique_ptr<lifePeriod> p1 = make_unique<lifePeriod>(lifeT);
unique_ptr<lifePeriod> p11(move(p1));
cout << "................结束..................." << endl;
}
cout << "***********************开始************************" << endl;
{
shared_ptr<lifePeriod> p2 = make_shared<lifePeriod>(lifePeriod());
cout << p2.use_count() << endl;
}
cout << "***********************结束************************" << endl;
{
unique_ptr<lifePeriod> p3(new lifePeriod);
}
cout << "++++++++++++++++++++++++开始++++++++++++++++++++++++++++" << endl;
{
unique_ptr<lifePeriod> p4 = make_unique<lifePeriod>();
}
cout << "++++++++++++++++++++++++结束++++++++++++++++++++++++++++" << endl;
{
shared_ptr<lifePeriod> p5 = make_shared<lifePeriod>();
cout << p5.use_count() << endl;
shared_ptr<lifePeriod> p6(p5);
cout << p5.use_count() << endl;
p5.reset();
cout << p5.use_count() << endl;
cout << p6.use_count() << endl;
cout << "##########################使用像指针,实际是类##############################" << endl;
cout << p6->a << endl;
unique_ptr<int> p(new int(1));
cout << "管理的变量名称为:" << typeid(*p).name() << " 值:" << *p << endl;
cout << "获取原始指针:" << *(p.get()) << endl;
}
cout << "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$weak_ptr$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" << endl;
{
//weak_ptr 只是监测资源,并不管理资源。
shared_ptr<int> sp(new int);
weak_ptr<int> wp1;
weak_ptr<int> wp2(wp1);
weak_ptr<int> wp3(sp);
weak_ptr<int> wp4;
wp4 = sp;
weak_ptr<int> wp5;
wp5 = wp3;
cout << "use_count: " << endl;
cout << "wp1: " << wp1.use_count() << endl;
cout << "wp2: " << wp2.use_count() << endl;
cout << "wp3: " << wp3.use_count() << endl;
cout << "wp4: " << wp4.use_count() << endl;
cout << "wp5: " << wp5.use_count() << endl;
//weak_ptr 类提供的 expired() 方法来判断观测的资源是否已经被释放
cout << "1. weak " << (wp5.expired() ? "is" : "is not") << " expired" << endl;
//weak_ptr 类提供的 reset() 方法来情况对象,使其不监测任何资源
wp5.reset();
cout << "2. weak " << (wp5.expired() ? "is" : "is not") << " expired" << endl;
cout << "wp4: " << wp4.use_count() << endl;
cout << "wp5: " << wp5.use_count() << endl;
//weak_ptr 类提供的 lock() 方法来获取管理所监测资源的 shared_ptr 对象
shared_ptr<int> sp1;
sp1 = wp4.lock();
cout << "sp1: " << sp1.use_count() << endl;
cout << "wp4: " << wp4.use_count() << endl;
}
}
2.结果
----------------开始-------------------
无参构造!
有参构造!
................结束...................
析构!
析构!
***********************开始************************
无参构造!
有参构造!
析构!
1
析构!
***********************结束************************
无参构造!
析构!
++++++++++++++++++++++++开始++++++++++++++++++++++++++++
无参构造!
析构!
++++++++++++++++++++++++结束++++++++++++++++++++++++++++
无参构造!
1
2
0
1
##########################使用像指针,实际是类##############################
1
管理的变量名称为:int 值:1
获取原始指针:1
析构!
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$weak_ptr$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
use_count:
wp1: 0
wp2: 0
wp3: 1
wp4: 1
wp5: 1
1. weak is not expired
2. weak is expired
wp4: 1
wp5: 0
sp1: 2
wp4: 2