C++Learn02--C++模板的使用与智能指针

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码

       模板是创建泛型类或函数的蓝图或公式,库容器,比如迭代器和算法,都是泛型编程的例子,它们都是使用了模板的概念。

       每个容器都有一个单一的定义,比如向量,我们可以定义许多不同类型的向量 比如 Vector<int>或vector<string>

       你可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。

       template <typename type> ret-type func - name(parameter list)

{     

      //函数的主体

}

#include <iostream>

#include<string>

template <typename T>

inline T const& Max (T const& a,T const& b)

{

     return a<b?b:al;

}

说智能指针之前,我们先看一下所谓的内存泄露问题,

       定义:在编写应用程序的时候,程序分配了一块内存,但已经不再持有引用这块内存的对象(通常是指针),虽然这些内存被分配出去,但是无法收回,将无法被其他进程所使用,我们说这块内存泄漏了,被泄露的内存将在整个程序声明周期内都不可使用:

主要原因:实在使用new或malloc动态分配堆上的内存空间,而并未使用delete或free即使释放掉内存。

 

 

一个例子:

 

 当出现异常时,(weird_thing()返回true),delete将不再被执行,因此将导致内存泄漏

我们会想,当remodel这样的函数终止(不管是正常终止,还是由于出现了异常而终止),本地变量都将自动从栈内存中删除——因此指针PS占据的内存将被释放,如果PS只想的内存也被自动释放,那该有多好啊。

我们知道析构函数有这个功能,如果PS有一个析构函数,该析构函数将在PS过期时自动释放它指向的内存,但PS的问题在于,它只是一个常规指针,不是有析构函数的类对象指针,如果它指向的是对象,则可以在对象过期时,让它的析构函数删除指向的内存。

这里说一下析构函数的意思:

       类的析构函数是类的一种特殊的成员函数,他会在每次删除所创建的对象时执行,析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号,作为前缀,也不能带有任何参数,析构函数有助于在跳出程序(比如关闭文件,释放内存等)前释放资源

这样的话,我梦就知道,auto_ptr,unique_ptr,shared_ptr这几个智能指针背后的设计思想,简单的总结一下就是:将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间

       因此,要转换remodel函数,应该按照下面3个步骤进行:

       包含头文件memory()智能指针所在头文件,

       将指向string的指针替换为指向string的智能指针对象;

       删除delete语句

       

 

      2:三大智能指针

      shared_ptr允许多个指针指向同一个对象,Unique_ptr独占所指向的对象   weak_ptr shared_ptr  的弱引用

      shared_ptr是一个标准的共享所有权的智能指针,就是允许多个指针指向同一对象,shared_ptr对象中不仅有一个指针指向某某(比如int型,还拥有一个引用计数器,代表一共有多少指针指向了那个对象)

      shared_ptr自动销毁所管理的对象,每当创建一个shared_ptr的对象指向int型数据,则引用计数器值+1.每当销毁一个shared_ptr对象,则-1,当引用计数器数据为0时,shared_ptr的析构函数会销毁int型对象,并释放它占用的内存

 

 

      weak_ptr(描述  in memory) 

      weak_ptr 是一种不控制所指向对象生存期的智能指针,指向shared_ptr管理的对象,但是不影响shared_ptr的引用计数,它像shared_ptr的助手,一旦最后一个shared_ptr被销毁,对象就被释放,weak_ptr不影响这个过程

      

posted @ 2021-08-09 10:16  专杀小三  阅读(132)  评论(0编辑  收藏  举报