接下来分享一些自己在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,就会比较容易出现小编犯的错误。