c++ vector 释放内存

来源:互联网 发布:政府与网络 编辑:程序博客网 时间:2024/05/21 01:30

1.释放单个指针

关于Vector中存放指针的问题,在进行清空的时候比较安全的一种做法是:
    std::vector<ClassName *> ClassNameVec;
    ...push_back(new ClassName());
    std::vector<ClassName *>::iterator ClassNameIt = ClassNameVec.begin();
    for(;ClassNameIt != ClassNameVec.end();++ClassNameIt)
    {   
        if(*ClassNameIt != NULL)
        {
          delete *ClassNameIt;
          *ClassNameIt = NULL;
        } 
    }
    ClassNameVec.clear();


2.释放数组

vector <int*>    vecInt;
for   (int   i   =0      ;i    <   10000;   i++)
{
int*   pint   =new   int[100];
vecInt.push_back(pint);
}
vector <int*> ::iterator   it_INT;
for   (it_INT   =   vecInt.begin()   ;   it_INT   !=   vecInt.end();   it_INT++)
{
    delete[]   (*it_INT);
}
vecInt.clear();

3 先释放内容,在释放内存

,注意存储的是外部指针的一个拷贝,删除时首先是删除这个拷贝指针的内容,也就是删除外部指针所指向内存的内容,然后再删除容

器中的变量(用来存储指针的内存).

#include "stdafx.h"
#include <vector>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
vector<char*> vecPtr;
char* ptr = new char[16];
ptr[0] = 0;
memcpy(ptr, "abc", 16);
vecPtr.push_back(ptr);
vector<char*>::iterator it = vecPtr.begin();
for (; it != vecPtr.end(); )
{
   delete[] *it;
   it = vecPtr.erase(it);
}
return 0;
}

4.注意临时变量带来的风险

在vector中存放东西要注意以下几点
存放不同对象没有任何问题,顶多就是耗费内存

但是如果存放指针时 请注意以下几点

vector<type1*> ConType;

ConType LtType;

void Add()
{
  Type1 temp;
  LtType.pushback(&temp); // 注意这个地方有问题。temp的实际地址空间在栈中, 函数结束后, temp就将被释放,这个时候

vector中的内存指向就是非法。
  可以如下这么改
  Type1* temp = new Type1(); // 这个时候temp在堆上
  LtType.pushback(temp); // 这样就没问题了