一、shared_ptr简单说明
如果一个实例指针被多个对象使用,而调用者不知道该什么时候释放该实例。那么可以使用shared_ptr来"托管"这个实例指针,当使用它的对象都被释放掉了,这个实例可以自动被释放。
可能有点绕,简单地说,就是类A的实例指针pA,被传入对象B、C、D中使用,那么当B、C、D被释放时,也就是不再持有pA时,pA指向的实例被自动释放。
shared_ptr的使用与普通指针类似。不过其内部有引用计数,若被引用次数=0,或者shared_ptr被销毁,那么其托管的对象就会被释放。
1.shared_ptr初始化:
class Buffer
{
//....
};
shared_ptr<Buffer> pSharedBuffer = make_shared<Buffer>();
make_shared()内部自动实例化Buffer对象。
禁止:shared_ptr不可多次引用同一对象。
int* p = new Buffer();
shared_ptr<int> sp1(p);
shared_ptr<int> sp2(p); // error
2.增加引用计数
shared_ptr<Buffer> xxx = pSharedBuffer;
此时xxx与pSharedBuffer指向同一个对象,且共用一个引用计数,为2,表示被引用2次。
3.reset()函数
pSharedBuffer.reset();
解除指针的托管,相当于pSharedBuffer引用计数=0,此时Buffer实例被释放。
4.若要使用shared_ptr封装this指针,则:
#include <memory>
class Test : public enable_shared_from_this<Test>
{
public:
Test() {}
~Test() {}
shared_ptr<Test> getThis()
{
return shared_from_this();
}
};
int main()
{
shared_ptr<Test> sp(new Test());
shared_ptr<Test> temp = sp->getThis();
return 0;
}
二、编写测试代码
Buffer类:
class Buffer
{
public:
Buffer()
{
cout << "Buffer()" << endl;
}
~Buffer()
{
cout << "~Buffer()" << endl;
}
void getPtr()
{
cout << "get buffer ptr" << endl;
}
};
User类:
class User
{
public:
void setBuffer(shared_ptr<Buffer> pBuf)
{
pBuffer = pBuf;
}
void useBuffer()
{
pBuffer->getPtr();
}
private:
shared_ptr<Buffer> pBuffer;
};
main():
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
shared_ptr<Buffer> pSharedBuffer = make_shared<Buffer>();
cout << "use count:" << pSharedBuffer.use_count() << endl;
User* user1 = new User();
user1->setBuffer(pSharedBuffer);
cout << "use count:" << pSharedBuffer.use_count() << endl;
user1->useBuffer();
User* user2 = new User();
user2->setBuffer(pSharedBuffer);
cout << "use count:" << pSharedBuffer.use_count() << endl;
user2->useBuffer();
delete user1;
cout << "use count:" << pSharedBuffer.use_count() << endl;
delete user2;
cout << "use count:" << pSharedBuffer.use_count() << endl;
pSharedBuffer.reset();
cout << "use count:" << pSharedBuffer.use_count() << endl;
return a.exec();
}
运行结果:
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。
本文涉及工程代码,公众号回复:06shared_ptr,即可下载。