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

关于list的clear()的问题

楼主meshwork(白开水)2003-08-04 11:43:10 在 C/C++ / 工具平台和程序库 提问

#include   <iostream>  
  #include   <string>  
  #include   <list>  
   
  using   namespace   std;  
  int   main(int   argc,   char   *argv[])  
  {  
  list<string*>   col;  
  string   *pStr1   =   new   string("i   love   this   game");  
  string   *pStr2   =   new   string("base   method");  
   
  col.push_back(pStr1);  
  col.push_back(pStr2);  
  col.clear();  
  //delete   pStr1;  
  cout<<pStr1->c_str()<<endl;  
  return   1;  
  }  
  Result:   i   love   this   game  
  问:   难道clear()   没有delete   list   中置入string*.  
          可在sgi_stl源码里   明明调用了string的析构函数.  
   
  问题点数:20、回复次数:10Top

1 楼liersgroom(孤独的眼泪)回复于 2003-08-04 12:20:35 得分 0

你用push_back的时候已经复制了一个string对象,然后clear的时候只是析构了那个复制的对象而pStrl指向的对象并没有析构Top

2 楼williamVII(spread)回复于 2003-08-04 13:07:47 得分 0

偶用vector试了一下,  
  clear只是把容器清空,  
  容器本身并不拥有压入的对象.  
   
  #include   <iostream>  
  #include   <string>  
  #include   <vector>  
   
  using   namespace   std;  
  int   main(int   argc,   char   *argv[])  
  {  
  vector<string>   vecStr;  
  string   s1="first",s2="second";  
   
  vecStr.push_back   (s1);  
  vecStr.push_back   (s2);  
  vecStr.clear   ();  
   
  cout<<vecStr.size   ()<<endl;  
  cout<<s1<<'\n'<<s2<<endl;  
  return   0;  
  }  
   
  输出:  
  0  
  first  
  second  
  Top

3 楼fangrk(加把油,伙计!)回复于 2003-08-04 14:33:34 得分 0

放入容器的是副本Top

4 楼meshwork(白开水)回复于 2003-08-05 10:53:38 得分 0

请注意,   偶放入list的可是一个指向string对象的指针.   没理由再复制一个新的string对象.   应该只是复制一个新的string类型的指针.Top

5 楼liersgroom(孤独的眼泪)回复于 2003-08-05 12:05:08 得分 0

不好意思,没有看清楚,那这样的话,clear()析构的就是(string   *)对象,就不会调用string的析构函数,而是调用(string   *)的析构函数,你new出来的对象自然不会被销毁  
  Top

6 楼jyfcsdn()回复于 2003-08-05 16:33:09 得分 5

list<string*>   col;  
  意味着你的col中存放的都是指向string的指针,指向你的Stirng对象。clear()只是把内部存放你push进去的指针副本的地址空间释放掉(甚至可能这些内存都没有释放)。当然不会delete掉你真正存在的String对象。Top

7 楼xiyi168(风云)回复于 2003-08-13 12:59:56 得分 0

在cleat()   前,好   delete   *iter   ,   不然有泄漏Top

8 楼echoher(Est Sularus oth Milthas)回复于 2003-08-15 01:46:35 得分 5

string*是原生指针,析构它是没用的Top

9 楼ShiChao(cpp)回复于 2003-08-15 09:15:50 得分 5

析构得是string*,而不是stringTop

10 楼smartduck(angus)回复于 2003-08-16 00:27:06 得分 5

看清除了,源码是这样写的:  
  void   push_back(const   T&   x){   insert(end(),   x);   }  
  加到list中的这是一个拷贝!与原来的无关。Top

相关问题

  • list?
  • RichEdit->Clear()与RichEdit->Lines->Clear();有区别吗?
  • Vector的clear和removeAllElements?
  • Rational Clear Case 哪儿有down?
  • DataList/List
  • 很简单的问题:CustomerData->cdsJiuDian->Params->Clear;
  • Query1.ParamByName('times').Clear;ExecSQL执行后出错
  • 怎样Clear DBGrid里面的东西?
  • 我有一个英文 clear quest
  • 有人懂crystal clear的模版吗?

关键词

  • vecstr
  • pstr
  • clear
  • col
  • back
  • push
  • delete
  • list
  • include

得分解答快速导航

  • 帖主:meshwork
  • jyfcsdn
  • echoher
  • ShiChao
  • smartduck

相关链接

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

广告也精彩

反馈

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