C/C++内存管理(下)

一、单例模式
1.设计模式
设计模式是一套被反复使用、很多人知道的、经过分类的、代码设计经验的总结
目的:为了代码可重用性,让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络。

2.单例模式
概念:一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个全局访问它的全局访问点,该实例被所有程序模块共享。

两种模式:

  • 饿汉模式
    (不管将来用不用,程序启动时就创建一个唯一的实例对象)
class Singleton
{
   public:
         static Singleton* GetInstance()
         {
              return &m_instance;
         }
  private:
         //构造函数私有
         Singleton() {};
         //防拷贝
         Singleton(Singleton const&);
         Singleton& operator=(Singleton const&);

         static Singleton m_instance;
  };
  //在程序入口之前就完成单例对象的初始化
  Singleton Singleton::m_instance;

优点:简单
缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定

  • 懒汉模式
class Singleton
{
     public:
          static Singleton* GetInstance()
         { 
              //使用Double-Check方式加锁,保证效率和线程安全
              if(nullptr==m_pInstance) {
                  m_mtx.lock();
                  if(nullptr==m_pInstance){
                  m_pInstance=new Singleton();
                  }
                  m_mtx.unlock();
                  }
                  return m_pInstance;
           }
           
           // 实现一个内嵌垃圾回收类
           class CGarbo{
               public:
                   ~CGarbo(){
                       if(Singleton::m_pInstance)
                         delete Singleton::m_pInstance;
                        }
                  };
                  
             //定义一个静态成员变量,程序结束时,系统自动调用它的析构函数
             static CGarbo Garbo;

     private:
             //构造函数私有
             Singleton() {};
             
             //防拷贝
             Singleton(Singleton const&);
             Singleton& operator=(Singleton const&);
   
            static Singleton* m_pInstance;
            static mutex m_mtx;
 };
 Singleton* Singleton::m_pInstance=nullptr;
 Singleton::CGarbo Garbo;
 mutex Singleton::m_mtx;

优点:第一次使用实例对象时,创建对象。进程启动无负载,多个单例实例启动顺序自由控制
缺点:复杂

二、内存泄漏
1.概念:内存泄漏是指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

2.分类

  • 堆内存泄漏
    堆内存指的是程序执行中依据需要分配通过malloc/calloc/realloc/new等从堆中分配的一块内存,用完后必须通过调用相应的free或者delete删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak

  • 系统资源泄漏
    指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

3.解决方案

  • 事前预防型,如智能指针
  • 事后差错型,如泄漏检测工具

你可能感兴趣的:(C++)