vector内存释放
之前看到这个问题,没有细究,过了两天被问到这个问题!!!

  1. 为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。
  2. STL实现者在对vector进行内存分配时,预留了一些额外的存储区,用于存放新添加的元素。
  3. size():成员指当前拥有的元素个数。
    capacity():成员指当前(容器必须分配新存储空间之前)可以存储的元素个数。
  4. 内存空间会自增长,需要存储空间时候,加倍当前容量的分配策略实现重新分配。例如,当前capacity为50,当添加第51个元素时,预留空间不够用了,vector容器会重新分配大小为100的内存空间,作为新连续存储的位置。
  5. 内存占用空间只增不减,clear(),erase()都是清空元素,但是空间还是没有释放。
  6. 需要动态清理占用空间可以使用deque(),线性访问,还支持从前添加元素。
  7. 默认情况下vector执行的是一种“用时间换空间”的做法,耗费大量的时间去不停的释放旧空间,开辟新空间。所以使用vector,最好还是预估一下数据大小,尽可能的减少释放和析构的次数。
  8. vector的析构函数由系统调用,比如局部变量使用完。
  9. 手动释放:

    vector nums;  
    nums.push_back(1);
    vector().swap(nums);||或者nums.swap(vector ())
    
    少有人用的方法:
    vector S;
    int* p = S.get_allocator().allocate(10);
    S.get_allocator().deallocate(p,100);
    
  10. vector存的指针的时候,释放vector之前,需要把指针也释放。
  11. 遍历各个指针
    for (vector<void *>::iterator it = v.begin(); 
    it != v.end(); it ++) 

    if (NULL != *it) 
    {       delete *it; 
        *it = NULL;
    }
    v.clear();

另外可以看看《Effective STL》第十七条款

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐