代码之家  ›  专栏  ›  技术社区  ›  Bruno Santos

QList行为怪异

  •  2
  • Bruno Santos  · 技术社区  · 16 年前

    我对Qt没有太多的经验,但不知怎么的,我觉得这有点奇怪。 使用VS2005编译:

    class Entry
    {
    public:
        Entry(const QString& aName, bool checked) : 
            name(aName), isChecked(checked)
        { 
            // empty 
        };
    
        Entry(const Entry& entry) : 
            name(entry.name), isChecked(entry.isChecked)
        { 
            // empty 
        };
    
        Entry& operator=(const Entry& entry)
        {
            name = entry.name;
            isChecked = entry.isChecked;
            return *this;
        }
    
        QString name;
        bool isChecked;
    };
    
    typedef QList<conduit::Entry> EntryVector;
    

    在以下行中使用EntryVector时,QList中的条目将成为错误指针:

    void EntryWidget::setEntries(QStringList& names)
    {
        QStringList::iterator member;
        EntryVector list;
    
        for (member = names.begin(); member != names.end(); ++member)
        {
            Entry entry(*member, false);
            list.append(entry);
        }
    
        m_model.setEntryData(list);
    }
    

    不知怎么的,条目名称列表中的指针将变为坏指针。我的理解是,QList应该能够支持其模板中的任何数据,但由于某种原因,我还不明白这不起作用。如果我使用STL向量,一切都正常。

    有什么想法吗?谢谢

    3 回复  |  直到 11 年前
        1
  •  1
  •   0xbaadf00d    15 年前

    我也有同样的问题,所以来找安沃斯。

    我觉得我的代码有问题,其实不然。

    正如达夫马克所建议的,当你把这些东西打印出来的时候,效果很好。

    davmac,请不要指出,当他给你一段代码来尝试时,他可能有内存损坏。如果你不能尝试同样的设置,那是另一回事。

        2
  •  0
  •   davmac    16 年前

    "条目名称“不是指针-它被声明为QString,在这里:

    public: QString name;
    

    那么,你说的“是什么意思?”条目名称会成为一个坏指针“?

    很可能是程序的其他部分导致了内存损坏。

        3
  •  0
  •   seboeh    12 年前

    我们知道QList没有深度拷贝。 see QList implicit sharing

    所以,在

    void EntryWidget::setEntries(QStringList& names) {...}
    

    字符串输入 姓名 是复制的。

    但是当你设置新的 进入

    m_model.setEntryData(list);
    

    列表 未复制到 .

    现在您可以访问 ,但在中指定的字符串 集合项目(…) 他们失去了他们的范围,当你离开 集合项目(…) 方法。

    注: Qt中的所有容器都有延迟求值的概念。 ,这是一个深度复制。这可能是Qt中的一个小错误。我只能说100%如果我看到.cpp)

    夸脱-项目.org/doc/qt-5/qstringlist.html#qstringlist-3