CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

vector使用中的疑惑?

楼主mission_g(小高)2001-07-24 10:44:07 在 C/C++ / C语言 提问

typedef   ....     mytype;  
  vector<mytype>   tt;  
  for(   int   i=0;i<300;++i   )  
  {  
                  tt.pushback(   instance_of_mytype   );  
                    ............  
                  if   (   i>10   )   tt.erase(tt.begin());  
  }  
  每个   instance_of_mytype   大小为400多k,呵呵,程序跑起来用top看一下内存的使用,  
  oh,   my   god!   线性增加,until   86兆左右,程序结束!  
  高人,who   knows   使用erase操作是不是真的释放了内存呀??我从begin()处删,vector是直接改变该vector处的首地址呢还是将后面的元素一一往前覆盖呀?期盼回复 问题点数:5、回复次数:12Top

1 楼tangtao(skywalker)回复于 2001-07-24 11:00:51 得分 5

    iterator   erase(iterator   __position)   {  
          if   (__position   +   1   !=   end())  
              copy(__position   +   1,   _M_finish,   __position);  
          --_M_finish;  
          destroy(_M_finish);  
          return   __position;  
      }  
   
  这是stl中源码,可以看出,只要不是最后一个元素,就把后面的逐个向前移动,destory()实际上执行的是调用析构函数,并不释放内存.Top

2 楼mission_g(小高)回复于 2001-07-24 11:26:56 得分 0

thank   skywalkerhttp兄,看来您对stl是颇有造诣啦,我正在入门,很想找     候捷   sir的  
  stl用法讲析   和   stl源码剖析,南京好像没见到过,您有着方面的电子档或消息吗?Top

3 楼mission_g(小高)回复于 2001-07-24 11:39:00 得分 0

还有一个疑惑,既然destory()调用的是析构函数,假若每个元素就是一个double   a[8848]的数组,  
  so   what   happened?数组哪来得析构函数呢?是不是这些内置的类型(或者说大小可以编译的时候即可确定)的元素它们不释放   or   清空     or   这块内存不管了?Top

4 楼tangtao(skywalker)回复于 2001-07-24 11:46:19 得分 0

造诣实在是不敢当,我也是在学习。  
   
  侯sir的几本书STL方面的书现在国内肯定没有,估计年底会由华中出。  
  不过可以去他的网站,它开放了一些书的章节,还有几篇STL的文章,很有价值!Top

5 楼tangtao(skywalker)回复于 2001-07-24 11:57:00 得分 0

没太明白你的意思。  
  若元素为内置类型,当然就不会调用析构函数。  
   
  实际上C++中new,delete操作是由两个步骤构成:分配(释放)内存,调用构造(析构)函数。  
  调用析构函数并不会释放对象本身的内存。Top

6 楼comet(黄昏十二乐章)回复于 2001-07-24 11:59:19 得分 0

侯sir网站网址是什么?Top

7 楼mission_g(小高)回复于 2001-07-24 12:22:01 得分 0

呵呵,候sir开放的几章我都down了,目前正在看stl用法讲析,可是,only第五章哎,馋的要命!!  
  :),以后有不懂之处要多多请教了!comet,csdn上不是有候sir的镜像吗?Top

8 楼mission_g(小高)回复于 2001-07-24 13:21:00 得分 0

还有既然new   的两个步骤     分配内存   ,调用构造函数  
  so  
                      class   A   {  
                              public:  
                                        A()   {   add=(char   *)malloc(1000*sizeof(char));   }  
                              private:  
                                        char   *add;  
                                        char   myadd[8848];  
                    }  
                    xx=new   A;  
  你的意思是不是首先分配myadd[8848]的内存(对象本身的内存??),so   应该改称先分配该类所占用的非动态内存(呵呵,原谅我用这个自造的词).Top

9 楼mission_g(小高)回复于 2001-07-24 13:35:24 得分 0

我在钱能c++教程上查到这么一句话,析构函数是在类对象生命期结束的时候,由系统自动调用,  
  也就是说,调用析构函数后,类对象也就不存在了,so   ,我上面的A类   其   myadd的8848个char所占的内存是不是不属于该进程了??如果是的话,不就是说,首先调用析构函数,然后释放内存(释放对象本身所占内存)???Top

10 楼tangtao(skywalker)回复于 2001-07-24 14:18:53 得分 0

就你这个例子,new的运行情况大致这样:  
   
  1,在heap中申请sizeof(A),即4+8848个byte个内存;  
  2,如1成功,在这个地址上执行构造函数,即为add指针再在heap中申请1000*sizeof(char)个内存;如成功,则xx对象成功建造!  
   
  如delete,情况类似,先执行析构函数释放add指向的内存,析构函数完成时,1中申请的内存还并未被释放。析构函数成功后,delete才释放1中申请的内存Top

11 楼vcmfc(【痛苦的虫虫】)回复于 2001-07-24 15:26:10 得分 0

这篇文章有你想要的东东:  
   
   
  在文档中心里的:  
   
  C++   常用模板武道会   第一场:  
  vector   v.s.   list   v.s.   deque  
  原创作者:beyond_mlTop

12 楼mission_g(小高)回复于 2001-07-27 11:39:17 得分 0

谢了Top

相关问题

  • ×××××在ADO中使用_variant_t的小疑惑×××××
  • 开发中工具使用的疑惑!
  • socket使用疑惑
  • std 里面的vector疑惑
  • sql在DELPHI5中使用的疑惑?谢谢~
  • 急急急,在RUP中,关于使用UML建模的疑惑
  • 急急急,在RUP中,关于使用UML建模的疑惑
  • 使用"<jsp:forward...>"的疑惑
  • 使用Calendar类时——疑惑
  • <<Thingking in JAVA>>里的疑惑 :Vector 与 ArrayList

关键词

  • c++
  • 函数
  • 内存
  • vector
  • stl
  • 执行
  • 析构函数
  • 调用
  • 释放
  • myadd

得分解答快速导航

  • 帖主:mission_g
  • tangtao

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo