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 に答える