讲解c++中的智能指针

什么是智能指针

  • 首先从字面上来看,智能指针首先他是一个指针,但是他比一般的指针来说更加的智能。
  • 将基本类型指针封装为类对象指针,并在析构函数里编写delete语句删除指针指向的内存空间。
  • C++里面的四个智能指针: auto_ ptr,shared_ ptr, weak_ ptr, unique_ ptr其中后三个是c++11支持,并且第一个已经被C++11弃用。

为什么会出现智能指针
我们先来看一个例子:

void Test()
{
	// 动态申请一个int类型的空间
	int* ptr1 = new int;
	delete ptr;//释放掉这个空间
}

new这样的操作就是为对象分配空间并返回一个指向该对象的指针。(与C语言中的malloc不同的是new可以调用构造函数)
delete接受一个动态对象的指针,并且销毁该对象(相比C语言中的free来说它调用析构函数。)并释放与之关联的内存。

这样的操作我们就会发现如果自己在写代码的时候忘记了写delete或者程序出现异常delete不被执行的话,就会造成内存的泄露。我们会说释放掉不就好了,当时在现实之中我们有很多的人会忘记或者不会在适当的位置加上delete。
我们知道析构函数,如果ptr有一个析构函数就能完成在ptr过期前自动释放掉它指向的内存。如果它指向的是对象,就可以在对象过期时调用析构函数释放掉它指向的内存。为了完成这一需求,智能指针出现了。

unique_ ptr

定义
unique_ptr是一种定义在中的智能指针(smart pointer)。它持有对对象的独有权——两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作。

unique_ptr<int> wu(new int());//初始化

unique_ptr拥有它所指向的对象,在某一时刻,只能有一个unique_ptr指向特定的对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。因此不允许多个unique_ptr指向同一个对象,所以不允许拷贝与赋值。

shared_ ptr

定义
shared_ptr是一种智能指针,作用有如同指针,但会记录有多少shared_ptrs共同指向一个对象。这便是所谓的引用计数。

shared_ptr<int> wu(new int());                //一个指向整数的shared_ptr 

shared_ptr 可以支持普通指针的所有操作,
shared_ptr 可以通过三种得到
1.通过一个指向堆上申请的空间的指针初始化(切记不要用栈上的指针,否则,当智能指针全部释放控制权(栈中的对象离开作用域本身就会析构一次),将会析构对象,导致出错)
2.通过make_shared函数得到
3.通过另外一个智能指针初始化

weak_ ptr

定义
weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用记数的增加或减少。没有重载*和->但可以使用lock获得一个可用的shared_ptr对象

weak_ptr虽然是一个模板类,但是不能用来直接定义指向原始指针的对象。
weak_ptr接受shared_ptr类型的变量赋值
weak_ptr的核心功能是不增加引用计数。

你可能感兴趣的:(讲解c++中的智能指针)