• 这里非常的绕口  需要仔细的来看看:

     destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备

     deallocate():真正的释放一个内存块。这是一个上层封装也就是delete函数的上层封装 在STL的空间配置器中 有可能会调用delete还给OS 也有可能就是放在内存池中 但是对于用户来讲就是释放内存块。

     看一个例子 应该就明白了真正的含义了:

  •  #include <iostream>
    
     #include <stdlib.h>
    
     #include <unistd.h>
    
     using namespace std;
    
     class A
    
     {
    
     public:
    
         A()
    
         {
    
             data=new char[];
    
         }
    
         ~A()
    
         {
    
             //free the data memory
    
             delete []data;
    
         }
    
     private:
    
         char *data;
    
     };
    
     int main(int argc,char* argv[])
    
     {
    
         for(;;)
    
         {
    
             A *a=new A;
    
             std::allocator<A> allocat;
    
             allocat.deallocate(a,sizeof(A));
    
         }
    
         return ;
    
     }

    明显 这样的做法会出问题,运行到一定的时间内会抛出异常。所以deallocate只是释放对象内存,并没有调用对象的构造函数释放对象内的动态内存  这点要注意  如果调用了一个  allocat.destory(a); 程序就不会有bug了

    所以在C++中, 对象释放和对象内动态内存释放是需要注意的 弄不好 就会出现内存泄露现象。

    这里的delete操作符号本身带有2个动作:调用析构函数 2释放内存。而::operator delete就只有释放内存。 deallocate函数就是基于operator delete函数封装的。 这点需要记住

    可以通过看STL源码发现 :像vector()的析构函数都是有2个操作: destory() 释放对象内的动态内存(如果有) deallocate是释放对象本身占有的内存  通过这2点  就能保证内存不能泄露了

最新文章

  1. ps中的位图,矢量图,颜色模式
  2. ubuntu linux mysql 安装 基本操作 命令
  3. I/O requests taking longer than 15 seconds to complete on file I/O瓶颈问题
  4. 【C#进阶系列】18 特性Attribute
  5. string.Format格式化
  6. Activity 和 生命周期: 创建
  7. 随笔—邀请赛前训— Codeforces Round #330 (Div. 2) B题
  8. 使用selenium来完成的例子
  9. RTLviewer与TechnologyMapViewer的区别?
  10. phpstorm使用svn爆出“cannot load supported formats” 的解决
  11. python 利用pop3接收邮件并保存附件
  12. [转] Android LocalService与RemoteService理解
  13. 如何下载coursera视频
  14. Android系统移植与驱动开发----第一章
  15. Android adb不是内部或外部命令 (转)
  16. IP相关常识
  17. WebApi实现原理解析笔记
  18. Java注解Annotation详解
  19. STL - priority_queue(优先队列)
  20. R语言学习 第十篇:操作符

热门文章

  1. JSON格式规范总结
  2. 洛谷 P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
  3. 聊聊WPF中的Dispatcher
  4. 减小SSN影响
  5. C# 不使用Task实现的多线程顺序执行
  6. rsync mac-&gt;windows openssh
  7. java反射专题一
  8. 问题:Oracle 树形遍历;结果:使用oracle进行遍历树操作
  9. sqlserver 使用维护计划备份
  10. LookupError: unknown encoding: cp65001解决办法