内存泄漏

1. new和malloc()

     1.1 malloc()函数
           原型为--void *malloc(unsigned int num_bytes); 
           分配num_bytes字节的内存并返回所分配内存的指针,如果失败返回空指针(NULL);
           void* 类型可以强制转换为任何其它类型的指针;
           通过free()函数释放malloc()要求分配的内存,释放成功后应该将该指针指向NULL;
     1.2 new运算符
           new不仅申请要求分配内存,还会为被分配的内存调用构造函数;
           对应地,delete在释放内存之前也会为内存调用析构函数;
           new分配内存失败时,返回std::bad_alloc异常;
     1.3 new与malloc()的区别
           new自动计算分配的内存空间,malloc需要自己设置;
           new返回的是对象(执行了构造函数),malloc返回的是内存地址;
           new是类型安全的,malloc无法实现此功能;
           new是运算符,maaloc是C的库函数;
 
2. 内存泄露
     2.1 内存泄露分为两种--堆(heap)内存泄露和系统内存泄露(socket未被释放);
     2.2 _CrtDumpMemoryLeaks()函数可以在输出窗口显示内存泄露的信息,如:
             int* i = new int(0);// not be delete
             _CrtDumpMemoryLeaks();
             return;
           将会输出如下内容: 
      Detected memory leaks!
        Dumping objects ->
      {234} normal block at 0x003007A8, 4 bytes long.
      Data: <    > 00 00 00 00 
      Object dump complete.
           CRT堆调试技术不仅仅用来检测内存泄露,还可以检测缓冲区是否溢出;
           CRT的原理就是匹配内存分配和内存释放操作,每次分配内存则将指针保存在list中,释放时再从list中删除; 
posted @ 2015-07-15 11:40  SHAEL_BLOG  阅读(172)  评论(0编辑  收藏  举报