1

我编写了以下函数,它以“块”作为参数,在块“lru”列表中搜索“块”。这里的“block”是类“Block”的一个实例。以下是“lru”的声明:

  list<Block> lru;

以下是我的搜索功能:

int LRU::searchLRU(Block block)
{
    if (lru.size() == 0) 
    {
        lru.push_back(block);
        return 1;
    }

    list<Block>::iterator i;

    for (i = lru.begin(); i != lru.end(); i++)              
    {
        if (i->get_set() == block.get_set() && i->get_index() == block.get_index()) 
        {
            lru.push_back(block);
            lru.erase(i);
            return 2;
        }
    }

    if (lru.size() == size)
    {
        lru.pop_front();
        lru.push_back(block);
        return 3;
    } 
}

但问题是有时函数返回“0”。因此,我的整个程序无法正常运行。我觉得我已经处理了所有的案件。

有人可以指出错误,或者为什么函数返回“0”。

4

1 回答 1

2

第一个 if 涵盖了空列表的情况,最后一个 if 涵盖了完整的列表情况,中间的 for 循环涵盖了非空非完整列表,但如果你没有找到块,你将不会从它返回,所以如果它既不完整也不是空的,你会从函数的末尾掉下来返回 0。如果不清楚,我会尝试改写:

empty list -> add item, return 0
full list -> pos item, add item, return 3
partially full list -> find item, *if found* {erase item, add item, return 2}

问题是如果找到了,如果你没有找到它,你什么都不做。你最终会掉下来(并且在 main 中返回 0,否则是 UB,请参见此处)。

于 2013-08-03T20:51:20.397 回答