关于list的clear()的问题
#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




