模板化函数在返回值时崩溃

时间:2014-09-21 21:15:51

标签: c++ pointers memory get crash

我创建了一个名为Map的双链表模板化类,它接受一个名为MapItem的结构,它有两个模板化变量(键和值),并对它们执行某些功能。截至目前,我的所有函数都工作,除了这个名为get的函数,它接受一个键和布尔变量作为参数,并且:返回与键关联的值,如果找到键则将布尔变量设置为true,或者不是返回任何内容并将布尔变量设置为false。当我在main中调用这个函数时,它会不断崩溃,我的思绪会被错误所困扰。让我知道你们的想法!

template <class keyType, class valueType>
valueType Map<keyType, valueType>::get(keyType key, bool & success) const
{
    if(sizeList == 0) //if the list is empty, set success to false since there is nothing to return
        success = false;
    else if(sizeList == 1) //if one item, check it to see if it's the one we're looking for
    {
        if(head->key == key) //if it is the item, return the value
        {
            success = true;
            return head->value;
        }
        else
            success = false;
    }
    else //if the size of the list is greater than 1, increment through it
    {
        int i = 1; 
        struct MapItem<keyType, valueType> *temp = head; //store head in temp as the first item to check and increment through all the items

        while(i <= sizeList)
        {
            if(temp->key == key) //if we found it
            {
                success = true;
                return temp->value;
            }

            temp = temp->next; //get the next item
            i++;
        }
    }
    success = false;
}

这里是我正在讨论的结构MapItem,它在Map类中用于存储项目:

template <class keyType, class valueType>
struct MapItem
{
  keyType key;
  valueType value;
  MapItem<keyType, valueType> *prev, *next;
};

是的,我知道函数get没有返回语句,如果它实际上没有找到密钥,但是我们的教授说它应该是OKAY但是在这一点上我开始不这么认为。可以实现错误异常来处理这个吗?感谢。

1 个答案:

答案 0 :(得分:0)

您的函数在失败时不返回值。这是一个错误:

  

6.6.3返回语句[stmt.return]

     

[...]
  流出函数末尾相当于没有值的返回;这导致未定义   值返回函数中的行为。

侧面观察:

不要使用out-parameter返回错误成功,而是考虑使用std::tuple<bool, valueType>

如果构建失败时的主要返回值是不可接受的,请抓取std::experimental::optional的预发行版(有时会在TC中跟随C ++ 14)。

Boost-implementation已经很好用了:http://www.boost.org/doc/libs/master/libs/optional/doc/html/index.html

第三种选择是在失败时抛出异常。