c++ 易错整理(一)

接下来分享一些自己在c++中踩过的雷

1. 容器使用 vector

先来看小编的一段错误代码

//自定义一个待释放容器 vector<stReleaseList> m_stReleaseList
//for循环遍历 m_stReleaseList容器
for (int i = 0; i < m_stReleaseList.size();i++)
{
	stReleaseList &info = m_stReleaseList[i];
	if (WK_TRUE == m_objActnCPicManage.releasePic(0, info.m_XPos, info.m_YPos, info.m_IsLeft))
	{//调用释放接口 -释放成功,删除容器中元素
		m_stReleaseList.erase(m_stReleaseList.begin() + i);
	}
	else
	{
		//释放失败,打印提示
		printf("cleanPic0 ******************* 清理图片失败 level[%d] Index[%d, %d] Isleft[%d]",
			0, info.m_XPos, info.m_YPos, info.m_IsLeft);
	}
}

if (0 != m_stReleaseList.size())
{//容器释放未全部完成
	printf("cleanPic0 ******************* 清理图片未全部完成!! ");
}

这段代码主要是用于清空容器中所有项对应的实际存储的数据,意味着这个容器最后一定为空。但实际上小编在实际运行中它没有清空(小编是个菜鸟,可能各位大佬一眼就看出来了问题所在)。

接下来小编对这段代码进行了修改

for (int i = 0; i < m_stReleaseList.size();)
{
	stReleaseList &info = m_stReleaseList[i];
	if (WK_TRUE == m_objActnCPicManage.releasePic(0, info.m_XPos, info.m_YPos, info.m_IsLeft))
	{
		m_stReleaseList.erase(m_stReleaseList.begin() + i);
	}
	else
	{
		//释放失败,打印提示
	    printf("cleanPic0 ******************* 清理图片失败 level[%d] Index[%d, %d] Isleft[%d]",
			   0, info.m_XPos, info.m_YPos, info.m_IsLeft);
		i++;
	}
}

if (0 != m_stReleaseList.size())
{//释放未完成
	printf("cleanPic0 ******************* 清理图片未全部完成!! ");
}

看到这里,想必各位大佬都明白了小编这个容器的删除操作的问题所在。
在第一次执行删除操作后,容器的size() -1,实际上下一个要删除的序号仍为当前序号。

2. for循环的执行次数的计算

先来计算for循环执行次数

#define ActionPicPoolNum (17) 
for (unsigned int i = ActionPicPoolNum - 1; i >= 0; i--)

我想应该也有部分跟小编最初想法一致的,觉得是(ActionPicPoolNum - 1 - 0)+ 1 即17次
但实际上并不是,这是个死循环。。。
为什么呢?这涉及到无符号数溢出
当i = 0时 满足条件,执行 for语句 然后进行 i–,此时 i 并不会等于 -1;因为 i 是个无符号整型,故它表示无符号整数的最大值

如果你想从大往小写循环正确的写法应该是

#define ActionPicPoolNum (17) 
for (unsigned int i = ActionPicPoolNum; i > 0; i--)

一般来说,i 用于数组的索引时容易出错。
你想让数组从最后一个ActionPicPoolNum -1 到 0,就会比较容易出现小编犯的错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值