new和delete要配套出现

    
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)局部变量和全局变量的处理方式是不一样的,需要注意。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值