3、C++ Mooc | 智能指针(unique、shared、weak)

使用智能指针先包含#include

智能指针是一个unique 指针,是指向一块内存的指针,能自动free,但是不能两个unique指针指向同一个内存,因为当其中一个被destroy后,就free了,另一个就指向free的内存。

1、创建智能指针

int main(){
    
    
	{
    
    
		std::unique_ptr<char> charactor(new char);
		std::unique_ptr<char> charactor=std::make_unique<char>;
	}
}
  • [ ~] 至于为什么不是 = new char; 因为unique_ptr定义中用了explicit,必须精简模式来定义这个智能指针。
    但由于 new 可能不安全(exception safety),又改成了第二行。

如果<类>,则进入scope就开始构造,跳出scope就开始析构,这就是智能指针的作用,自动构造和析构。
注意,这个unique指针的copy constructor 和 assignment 操作符都被删除了,见定义:
在这里插入图片描述
因此,不能对unique指针赋值、复制构造器。
如果想要共享智能指针,就要用shared_ptr,实际的shared指针根据编译器的不同而不同,本质上而言,就是用一个叫做引用计数器的东西。

shared 指针工作原理,使用reference counting,保持对使用到的 [对指针的引用] 进行计数追踪,知道就指针的引用为 0 时,就delete释放内存。
注意: shared指针不用new分配的原因并不是,exception safety,而是这个shared指针必须要分配到一个block 内存,叫做 control block memory,在这个内存上,是存储 指针的引用 个数的。


```cpp
int main(){
    
    
	{
    
    
		std::shared_ptr<APP> b=std::make_shared<APP>();
		{
    
    
		std::shared_ptr<APP> a=std::make_shared<APP>();
		b=a;
		}//1
	}//2
}

可以看到,执行到2的时候,才会析构这个shared指针,也就是当所有的shared指针引用(或栈分配的objects)走出scope时,就free了。
如果不想在指针赋值时候增加shared指针的引用计数,就要用个weak_ptr指针,如下:

int main(){
    
    
	{
    
    
		std::weak_ptr<APP> b;
		{
    
    
		std::shared_ptr<APP> a=std::make_shared<APP>();
		b=a;
		}//1
	}//2
}

这个时候,直接在1结束后就析构shared指针内存了。

猜你喜欢

转载自blog.csdn.net/weixin_42557786/article/details/107586846