1、vector初始化有一种用法:
vector<int> a(n,1);
表示在a中初始化n个1。
有时经常会忘记了然后写出了这样的语句:vector<int> a(-1,1) ,发现编译器只是中断程序,却没有报出具体的错误。
单步调试时,由于这句话在子函数中,也很难调出来。 谨记谨记!!
具体什么原因:查看了《STL源码》
发现vector的定义如下:
vector(size_type n,const T& value)
{fill_initialize(n,value);}
再看fill_initialize函数
void fill_initialize(size_type n,const T& value)
{
start=allocate_and_fill(n,value);
finish =start +n;
end_of_storage=finish;
}
再转allocate_and_fill函数
iterator allocate_and_fill(size_type n,const T& x)
{
iterator result= data_allocator::allocate(n);
uninitialized_fil_n(result,n,x);
return result;
}
发现allocate中是通过new来分配内存的,new的参数中个数都是无符号数,所以不符合定义。
2、vector的析构
vector申请的空间是存在堆中的
一般析构函数只能释放vector中的元素,并不能释放里面的空间。
可以用下面这种方法释放:
- vector<int>().swap(arr); //交换后
- //方法二、
- {
- vector<int> temp;//临时对象未初始化,其缓冲区大小为0,没有数据
- arr.swap(temp);//与我们的对象交换数据,arr的缓冲区就没了。
- }//临时变量会被析构,temp调用vector析构函数释放空间