0
class MyLinkedList
{
    int size_;
    Node head;

    void setVal(void *val, int type)
    {
        Node n;
        n.value = val;
        head.next->prev = &n;
        n.next = head.next;
        head.next = &n;
        n.prev = &head;

        n.type = type;
        size_++;
    }

    MyLinkedList()
    {
        size_=0;
        head.type = 0;
        head.next = &head;
        head.prev = &head;
    }

    void setValue(string value)
    {
        cout << value << endl;
        setVal(&value,3);
    }

    void toConsFirst()
    {
        int *i;
        double *d;
        string *s;
        switch(head.next->type)
        {
            case 3:
            s = (string*)(head.next -> value);
            cout << *s << endl;
            return;
        }
    }
}

ケース 3 に問題があります: from "*s" はコンソールに文字列を出力しません。しかし、setValue() 文字列の「値」は問題ありません。ケース 3 では、"&value" の "value" と "s" の "*s" から seValue() を変更します。これは addr と同じです。

4

2 に答える 2

4

問題は、一時へのポインターを格納していることです。

void setValue(string value){
    cout << value << endl;
    setVal(&value,3);
}

ここで、はリストにsetVal()保持されますが、の有効期間は上記の方法を超えて延長されません。これを修正する 1 つの方法は、ヒープに文字列のコピーを割り当てることです (ただし、完了したら割り当てを解除することを忘れないでください)。&valuevalue

@Mat がコメントで指摘しているように、同様のバグがsetVal()にあり、ローカルへのポインタを保持しようとしますNode n

最後に、タイプ ID を保持してからそれらをオンにする全体のスキームを見るのはかなり面倒だと思います。これはおそらくプログラミングの演習であり、テンプレートをまだ紹介されていない可能性があることは承知していますが、もしあれば、これは彼らにとって完璧なアプリケーションになるでしょう.

于 2012-11-29T18:17:46.077 に答える
0

ヒープに新しい文字列を割り当て、渡された文字列値をそれにコピーすることで setValue を修正する方法は次のとおりです。

void setValue(string value){
    string* s = new string(value);
    setVal(s, 3);
}
于 2012-11-29T18:24:42.120 に答える