c++ vector clear() 方法的问题

intmain(intargc,char*argv[]){intarray[5]={1,3,2,5,4};vector<int>v(array,array+5);//so... int main(int argc, char *argv[])
{

int array[5]={1,3,2,5,4};
vector<int> v(array,array+5); //sort(v);
sort(v.begin(),v.end());
v.clear() ; ?? 我这里都清空了啊
cout<<v[0];?? 这里为什么还能取出来值呢
system("PAUSE");
return EXIT_SUCCESS;
}
展开
 我来答
匿名用户
推荐于2017-09-08
展开全部
  vector,clear()并不真正释放内存(这是为优化效率所做的事),clear实际所做的是为vector中所保存的所有对象调用析构函数(如果有的话),然后初始化size这些东西,让觉得把所有的对象清除了。
  真正释放内存是在vector的析构函数里进行的,所以一旦超出vector的作用域(如函数返回),首先它所保存的所有对象会被析构,然后会调用allocator中的deallocate函数回收对象本身的内存。
  所以,某些编译器clear后还能访问到对象数据(因为它根本没清除),在一些比较新的C++编译器上(例如VS2008),当进行数组引用时(例如a[2]这种用法),STL库中会有一些check函数根据当前容器的size值来判断下标引用是否超出范围,如果超出,则会执行这样一句:
  _THROW(out_of_range, "invalid vector<T> subscript");
  即抛出一个越界异常,clear后没有捕获异常,程序在新编译器编译后就会崩溃掉。
雪澄铁5549
2011-09-27 · TA获得超过172个赞
知道答主
回答量:329
采纳率:0%
帮助的人:215万
展开全部
你的这个问题不应该拿来讨论,而应该避免;
vector 存放的是副本,如果元素是指针,元素只是简单的复制指针的地址,
你用float *p=new float; 然后放入vector ,最后不管删除哪一个都会造成悬空指针,
非常糟糕的设计方法
追问
什么意思啊 什么悬空指针 我没看明白啊 麻烦在解释一下 谢谢您了
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
guonen45
2011-09-26 · TA获得超过102个赞
知道答主
回答量:372
采纳率:0%
帮助的人:191万
展开全部
因为对于vector,clear并不真正释放内存(这是为优化效率所做的事),clear实际所做的是为vector中所保存的所有对象调用析构函数(如果有的话),然后初始化size
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
琴秀曼Bp
2011-09-26 · TA获得超过690个赞
知道小有建树答主
回答量:615
采纳率:0%
帮助的人:666万
展开全部
因为相应内存区域的内容并没有被覆盖,这样就保持着原来的值,直到这部分内存被重新写入时才会改变。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式