VC vector clear() 的问题
发布网友
发布时间:2022-04-26 15:00
我来回答
共2个回答
热心网友
时间:2022-05-07 23:06
因为对于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后没有捕获异常,程序在新编译器编译后就会崩溃掉。。。。
热心网友
时间:2022-05-08 00:24
我使用的你代码一运行就崩溃了,明显vector中的值正常的被清除了,没有出现你说的情况。