在之前的笔记中讲过new关键字,以及在堆上建立数组,我们说new分配空间,让创建的变量作用域在全局上,而且需要手动delete规定结束位置。会不会写着代码忘记要写delete呢?会的,所以我们还可以使用智能指针unique。
unique_ptr
从英文上讲unique表示唯一,代表了智能指针不可以被复制。为什么?想想下创建AB两个智能指针指向同一个地址,当A指针被销毁时意味着指向的内容也被销毁,那么B指向的就不再是内容而是被销毁的内容。
class Entity
{
public:
Entity()
{std::cout<<CreateEntity<<std::endl;}
~Entity()
{std::cout<<DestroyEntity<<std::endl;}
void Printf(){}
};
int main ()
{
{
std::unique_ptr<Entity> e = std::make_unique<Entity>();
e->printf();
}
std::cin.get();
}
创建Entity类构造与析构函数、printf函数。e->指针调用类内函数。
std::unique_ptr<Entity> e = std::make_unique<Entity>();就是创建unique_ptr<Entity>指向Entity的智能指针e ,std::make_unique<Entity>();相当于用new创建一个Entity实例指针并分配内存。
达到什么效果呢?在我们创建的作用域下运行到}时,自动调用delete删除指针。
功能类似我们在栈上创建的指针,具体优点参考栈与堆的区别。
shared_ptr
{
std::unique_ptr<Entity> e = std::make_unique<Entity>();
std::shared_ptr<Entity> e1 = std::make_shared<Entity>();
e->printf();
}
}
std::shared_ptr<Entity>与std::unique_ptr<Entity>功能上一样但是不同的一点是shared_ptr多出一块内存用来储存引用计数。
std::shared_ptr<Entity> e1 = std::make_shared<Entity>();
代码就是创建了new Entity然后传递给shared_ptr的构造函数,然后一块内存存放控制内存块。
它要怎么用呢?
class Entity
{
public:
Entity()
{std::cout<<CreateEntity<<std::endl;}
~Entity()
{std::cout<<DestroyEntity<<std::endl;}
void Printf(){}
};
int main ()
{
{
std::shared_ptr<Entity> e0
{
std::shared_ptr<Entity> e = std::make_shared<Entity>();
e0 = e;
}//17
}
std::cin.get();
}
运行1516行打印CreateEntity,17行时并没有打印DestroyEntity。然而我们让e与e0分享,只有运行到18行时才会打印DestroyEntity。这是因为shared_ptr指针发现有两个指针存在e0 = e分享,所以只有两个都消失时Entity才会被销毁。