vector的clear方法注意事项

  void clear():删除存储在vector中的所有元素

一、

  1.如果vector的元素是一些object,则它将为当前存储的每个元素调用它们各自的析构函数。

  2.如果vector存储的是指向对象的指针,此函数并不会调用到对应的析构函数。会造成内存泄漏。想要删除vector中的元素则应遍历vector使用delete,然后再clear

  for(int i = 0; i < vec.size(); ++i)

  {

    delete vec[i];

  }

  vec.clear();

  调用clear后,vector的size将变成0,但是它的容量capacity并未发生改变,clear只是删除数据,并未释放vector的内存

  vector的clear不影响capacity

  如果想要清空vector的元素,使用clear,如果想要释放vector的容量,可以使用swap

二、使用swap释放vector的容量

  vector<A>().swap(vec);

  或者vec.swap(vector<A>());

  重点:如果vector容器的元素是指针,先遍历容器,delete每个元素指向的内存,然后再用swap

  

  

时间: 2024-11-05 14:57:51

vector的clear方法注意事项的相关文章

实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)

之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中,vector A中的结果我们可想而知,但是vector B中的元素还会如何? 看看之前写过的程序: #include <iostream> #include <vector> int main () { std::vector<int> myvector (3,100); std::vector<int>::iterator it; it = myvector

Java中vector的使用方法

Vector的使用 vector类底层数组结构的,它包含可以使用整数索引进行访问的组件.不过,vector的大小可以根据需要增大或缩小,以适应创建vector后进行添加或移除项的操作,因此不需要考虑元素是否越界或者会不会浪费内存的问题. 由vector的iterator和listIterator方法所返回的迭代器是快速失败的:也即是它不能并发执行操作.如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的remove或add方法之外的任何其他方式),则迭代器将抛出ConcurrentM

UITableView控件didSelectRow和didDeselectRow方法注意事项

UITableView控件didSelectRow和didDeselectRow方法注意事项 1. 因Xcode强大的自动补全功能,在使用UITableView如下两个方法时,务必特别小心,避免出错: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView *)tableView didDeselectRo

vector的clear

要求你熟悉stl,言下之意就是要你熟悉stl的内部实现. vector的clear动作并不回收内存,有点像内存泄露但又不是内存泄露,因为下次装入元素不用分配内存,直接使用这些预分配内存, clear并不改变vector的capacity.vector内的元素如果是对象型会在clear时调用对应的析构,如果是指针型,vector并不负责释放 内存,这个会引起真正的内存泄露. 如果你想回收vector的内存,那么可以用swap技法,比如vector<type> tmp.swap(v) .这将生成一

delphi 中TStringList Clear 方法的时候该对象有没有被释放

delphi 中TStringList 通过function AddObject(const S: string; AObject: TObject): Integer; 方法添加了一个对象,请问我在调用Clear 方法的时候该对象有没有被释放 object里存的只是指向对象的指针,clear只是把指针清除了,对象并没有被释放.TObjectList可以自动释放对象,剩下的TList,StringList等List类型的都需要手动释放.

【STL】vector的insert方法详解

#include<vector> #include<iostream> using namespace std; int main() { vector<int> v(3); v[0]=2; v[1]=7; v[2]=9; v.insert(v.begin(),8);//在最前面插入新元素. v.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素 v.insert(v.end(),3);//在向量末尾追加新元素. vector<int

java.nio.ByteBuffer中flip,rewind,clear方法的区别

对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. position:代表对缓冲区进行读写时,当前游标的位置. capacity:代表缓冲区的最大容量(一般新建一个缓冲区的时候,limit的值和capacity的值默认是相等的). flip.rewind.clear这三个方法便是用来设置这些值的. clear方法 public final Buffer

List集合的removeAll(Collection&lt;E&gt; col) 和clear方法的区别

//removeAll()方法private static void testList(){ List<String> list = new ArrayList<String>(); List<String> list1 = new ArrayList<String>(); list.add("123"); list.add("456"); list1.add("123"); list.remove

C#中List&lt;object&gt;.Clear()方法和实例化new List&lt;object&gt;()操作的结果分析

    本文主要的目的是想简单的探讨一下C#中List针对内存的操作过程,以便以后遇到该种情况可以避免走进误区,内容非常简单,只是在此作为记录.能帮到人最好,帮不到就当给自己提个醒.C#将复杂的指针操作全都隐藏到后台去处理,以至于是我们很到看到C#的本质. C#中list<T> list=new List<T>();中new的过程是建立一块内存空间,是新建一个没有元素的空列表对象. C#中list.Clear()是把new之后的那块内存空间的内容清空,并不是删除这块内存空间,是清除