c++ vector 释放内存
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); // 这样就没问题了