前几天,KOK3客户端因为我的资源配置错误而崩溃了。
调试器带我到了出错的代码行,是一个空指针解引用。
代码大致如下:
Item* pItem = itemList.getItem(index);
return *pItem;
getItem方法如下:
Item* ItemList::getItem(int index)
{
if (index < 0) return NULL;
if (index >= size()) return NULL;
return _list[index];
}
错误是因为资源加载出错,列表为空,所以getItem()返回NULL.
对于资源加载出错,应该加载时就提示出错,不应该在使用时才报错。
getItem()做了索引越界出错处理,所以它的调用者必须检查其返回值。
假设ItemList的指针元素保证不为空,正常情况下,索引正确情况下都不会返回空指针。
这种情况下,添加断言是必要的。
Item* pItem = itemList.getItem(index);
assert(pItem);
return *pItem;
Item* ItemList::getItem(int index)
{
...
assert(_list[index]);
return _list[index];
}
对与索引值,还是用无符号数为好,可省去下界溢出断。