vector使用中的疑惑?
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




