why:为何要有智能指针
当我们在堆上使用一块内存的时候,需要new和delete。但是,通常在一块地方new的内存,会忘记delete,或者说申请了很多内存确记不清楚,何时何地去释放它们。
what:什么是智能指针
所以智能指针就横空出世了,只要你把这块内存交给它托管,当生命周期结束的时候,由它自己去释放这块内存。
智能指针的分类
unique_ptr、shared_ptr、weak_ptr.
how:怎么用智能指针
unique_ptr
顾名思义,唯一的,不能复制的智能指针
show your code
#include<iostream>
#include<memory>
class text
{
private:
/* data */
public:
text(/* args */);
~text();
};
text::text(/* args */)
{
std::cout << "Created" << std::endl;
}
text::~text()
{
std::cout << "Destroy" << std::endl;
}
int main()
{
std::unique_ptr<text> m(new text());
std::unique_ptr<text> te = m;//这里会报错
return 0;
}
只需要将new出来的内存交给智能指针,剩下的都不用管了。
为什么会报错,让我们看一下源码。
unique_ptr里,将拷贝构造给禁止了,人家就不允许拷贝,我这是unique我是唯一的。
shared_ptr
如果你的数据需要你共享内存,只有一个指针指向这里并不能很好的处理数据,OK,那就用shared_ptr。
内部机制是引用计数,有两个人同时入住同一户房子,现在租客有两个,当一个人搬走了,引用计数也就为1,又搬来两个人,此时引用计数为3。当所有人都搬走时,引用计数为0,此时对这段内存delete。
show you code
#include<iostream>
#include<memory>
class text
{
private:
/* data */
public:
text(/* args */);
~text();
};
text::text(/* args */)
{
std::cout << "Created" << std::endl;
}
text::~text()
{
std::cout << "Destroy" << std::endl;
}
int main()
{
{
std::shared_ptr<text> t0;
{
std::shared_ptr<text> t1 = std::make_shared<text>();
t0 = t1;
}
}
return 0;
}
t0和t1指向同一块内存,当t1的生命周期结束时,text不会打印Destroy,因为引用计数还不为0,t0还依然指向它,可是,当t0的生命周期也结束了,那么这块内存就被释放了,此时打印Destroy。
weak_ptr
辅助,纯纯的辅助,嗯.....怎么不算辅助呢?
它可以和shared_ptr一起用,目的就是为了获取我shared_ptr还有多少引用计数,我这个智能指针还能不能用,说是辅助也行,更像是一个查询工具。
作为一个查询工具,本身不具备实体,指向同一块内存也不会增加引用计数。
都看到这里了,点个赞再走吧