智能指针
#include<iostream>
#include<memory>
using namespace std;
class TyTest{
private:
int a;
int b;
public:
TyTest(int x, int y)
{
a = x;
b = y;
}
void show()
{
cout << "a:" << a << endl;
cout << "b:" << b << endl;
}
~TyTest()
{
cout << "我是析构函数\n";
}
};
//1.先把智能指针用起来, 关于智能指针应该要学shared_ptr、unique_ptr、weak_ptr
void playex()
{
//1.1 shared_ptr的使用:
//实现共享式拥有(shared ownership)概念。多个智能指针可以指向相同对象.
/*
shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的
引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,
但是对象的读取需要加锁。
*/
/*
**第一种方法
*/
cout << "第1种使用方法\n";
//普通变量
shared_ptr<int> m_int1(new int(20));
cout << *m_int1 << endl;
//对象
shared_ptr<TyTest> m_Tytest1(new TyTest(10, 11));
m_Tytest1->show();
//使用get获取原始指针
TyTest *ptr = m_Tytest1.get();
ptr->show();
/*
*第二种方法
*/
//普通变量,使用make_shared
cout << "第2种使用方法\n";
shared_ptr<int> m_int2 = make_shared<int>(2);
cout << *m_int2 << endl;
//对象
shared_ptr<TyTest> m_Tytest2 = make_shared<TyTest>(101, 102);
m_Tytest2->show();
//shared_ptr可以拷贝
shared_ptr<int> m_copyint2(m_int2);
cout << "我是复制的:" << *m_copyint2 << endl;
cout << "m_int1的数量:" << m_int1.use_count() << endl;//1
cout << "m_int2的数量:" << m_int2.use_count() << endl;//2
shared_ptr<int> m_int3 = m_copyint2;//赋值
cout << "m_int2的数量:" << m_int2.use_count() << endl;//3
//1.2 unique_ptr的使用:
//实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,
//保证同一时间内只有一个智能指针可以指向该对象
unique_ptr<int> m_uniqueint(new int(521));
cout << *m_uniqueint << endl;//521
//使用get获取原始指针
int *ptrx = m_uniqueint.get();
cout << "m_uniqueint的原始指针:"<< *ptrx << endl;
//unique_ptr<int> m_uniqueint1 = m_uniqueint; 不可以赋值
//unique_ptr<int> m_uniqueint2(m_uniqueint); 不可拷贝
//1.3 weak_ptr的使用:
//weak_ptr是为了配合shared_ptr而引入的一种智能指针,因为它不具有普通指针的行为
shared_ptr<TyTest> m_Ty1 = make_shared<TyTest>(11, 21);
weak_ptr<TyTest> m_ty1weak(m_Ty1);
//use_count(),观察应用计数
cout << "m_Ty1的数量:" << m_ty1weak.use_count() << endl;
//expired(),相当于use_count() == 0,但比它快
if (!m_ty1weak.expired())
{
//lock()函数,将返回一个存储空指针的shared_ptr
shared_ptr<TyTest> m_Ty2 = m_ty1weak.lock();
cout << "m_Ty1的数量:" << m_ty1weak.use_count() << endl;
}
}
void main()
{
playex();
system("pause");
}
结果:
//总结:智能指针原理就是以对象管理资源,可以看看我之前的文章,