1

我有以下功能:

ItemSet* Library::itemsForKeyword(const string& keyword)
{
    ItemSet temp;

    for(it=bookList.begin();it!=bookList.end();it++){
        if(it->getPtr()->findKeyWord(it->getPtr()->keywordsList, keyword))
            temp.insert(*it);
    }

    ItemSet* temp2 = &temp;
    return temp2;
}

ItemSet 是一个包含 ItemPtr 实例的集合,其中包含指向派生类实例的指针。'it' 是Library 中定义的迭代器,findKeyWord 是一个将keywordsList 与关键字进行比较以确定该关键字是否在该列表中的函数。如果它返回 true,那么我取消对迭代器的引用,并将它当前正在迭代的实例添加到 temp。我的问题是,当循环完成时,我返回 temp2,但它返回空,并在我的打印函数打印它时导致错误。为什么返回是空的?谢谢。

4

4 回答 4

6

您正在返回一个指向本地对象的指针,该对象在从函数返回时被破坏。那肯定是未定义的行为。

另外,我不明白为什么需要返回指针。您可以返回对象本身:

ItemSet Library::itemsForKeyword(const string& keyword)
{
   ItemSet temp;
   //your code
   return temp;
}

如果您需要返回指针,那么我建议您返回智能指针,而不是原始指针。

std::unique_ptr<ItemSet> Library::itemsForKeyword(const string& keyword)
{
   std::unique_ptr<ItemSet> temp(new ItemSet());
   //your code, use this syntax =>  temp->insert(*it);
   return std::move(temp);
}
于 2012-12-11T10:05:03.100 回答
2

您正在返回局部变量的地址,这将不起作用。

要么提供一个项目作为你修改的函数的参数,要么在你的函数中分配一个项目并返回它的地址。

于 2012-12-11T10:04:58.207 回答
1

在您与讲师发表评论后,主要代码......

ItemSet* Library::itemsForKeyword(const string& keyword)
{
    ItemSet* p_temp = new ItemSet;

    for(it=bookList.begin();it!=bookList.end();it++){
        if(it->getPtr()->findKeyWord(it->getPtr()->keywordsList, keyword))
            p_temp->insert(*it);
    }

    return p_temp;
}

编辑:您应该向您的讲师@Nawaz 示例展示:)

于 2012-12-11T10:25:23.897 回答
0

您不能返回分配在堆栈上的对象的地址。函数返回后,堆栈上的对象被销毁并且指针指向一些垃圾。

于 2012-12-11T10:05:08.653 回答