int* i1 = new int;
*i1 = 1;
int* i2 = new int;
*i2 = 2;
vector<int*> int_vector;
int_vector.push_back(i1);
int_vector.push_back(i2);
int_vector.clear();
cout << i1 << "," << (*i1) << endl;
以上代码虽然vector进行了元素删除操作,但是在进行打印的时候,发现i1的地址不是nullptr,*i1的值为1,也就是说内存没有被释放,如果使用如下方法,是无法做到内存释放的:
for (std::vector<int*>::iterator it = int_vector.begin(); it != int_vector.end(); it++)
{
if (nullptr != (*it))
{
delete (*it);
*it = nullptr;
}
}
正确的方法:
1)第一种方法,使用指向指针的指针,如下:
int* i1 = new int;
*i1 = 1;
int* i2 = new int;
*i2 = 2;
vector<int**> int_vector;
int_vector.push_back(&i1);
int_vector.push_back(&i2);
for (std::vector<int**>::iterator it = int_vector.begin(); it != int_vector.end(); it++)
{
cout << *it << "," << *(*it) << endl;
if (nullptr != (*(*it)))
{
delete (*(*it));
*(*it) = nullptr;
}
}
cout << i1 << endl;
int_vector.clear();
2)第二种方法,对于new的对象一个一个删除:
vector<int*> int_vector_1;
int_vector_1.push_back(i1);
int_vector_1.push_back(i2);
if (i1 != nullptr)
{
delete i1;
i1 = nullptr;
}
if (i2 != nullptr)
{
delete i2;
i2 = nullptr;
}
cout << i1 << "," << i2 << endl;
int_vector_1.clear();
3)通常使用方式,使用局部变量申请内存,并且把变量存储到存储指针的容器中:
vector<int*> int_vector_2;
for (int i = 0; i < 5; ++i)
{
int* aaa = new int;
*aaa = i;
int_vector_2.push_back(aaa);
}
for (std::vector<int*>::iterator it = int_vector_2.begin(); it != int_vector_2.end(); it++)
{
cout << *it << endl;
if (nullptr != (*it))
{
delete (*it);
*it = nullptr;
}
}
for (std::vector<int*>::iterator it = int_vector_2.begin(); it != int_vector_2.end(); it++)
{
cout << *it << endl;
}
int_vector_2.clear();
【说明】:
1)new和delete要成对出现;
2)容器对元素进行清理的时候不会释放new出来的内存;
3)局部变量和全局变量的处理方式是不一样的,需要注意。