上述代码有几个地方要详细解析一下:
  1. 在释放类的时候,如果类中有动态变量成员,一般要先释放其中的内容,然后在调用析构函数释放类本身的空间。类似的,比如在vector<int*> array,如果直接array.clear,其中,分配的内存空间会泄露,正确的方法是,先释放掉分配的内容,然后清空空间。
  for (vector<void *>::iterator it = v.begin(); it != v.end(); it ++)
  if (NULL != *it)
  {
  delete *it;
  *it = NULL;
  }
  v.clear();
  2. 上述代码定义了一个锁类,封装了临界区的相关操作,作为资源管理类,内部有临界区变量,作为多线程安全的保证。局部资源管理类变量使得,当异常发生时,也能调用析构函数,释放临界区资源
  3. 在进行判断时,判断了两次,提高效率。因为该方法调用第一次产生实例,而pInstance == NULL 大部分情况下都为false,如果只判断一次,那么每次获取实例前都需要加锁,效率太低。
  4. 定义一个嵌套类,和对应的静态局部变量,这样,当整个单例释放之前,可以通过它来找到单例指针,然后delete掉他,这样不会有内存泄露发送了。
  5. 使用CRT类函数的内存泄露检测功能,方便查看调试。
  文章的后,给出测试结果图:

  OK!
  读者可以在各个构造和析构函数中间加上端点,也可以尝试注释掉CGarbo的析构函数调试,看看有没有内存泄露。
  好久没有更新文章,这段时间工作很忙,忙不可怕,可怕的是没有目的、没用动机的忙。