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()保留&value在列表中,但value的生命周期不会超出上述方法。解决此问题的一种方法是在堆上分配字符串的副本(但不要忘记在完成后释放它)。

正如@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 回答