QList表现奇怪

时间:2010-08-24 19:53:56

标签: c++ qt qt4

我对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);
}

不知何故,列表中的entry.name将成为一个坏指针。我的理解是QList应该能够支持其模板中的任何数据,但由于某些原因我还不明白这不起作用。如果我使用STL Vector,一切正常。

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并且正在寻找避孕者。

我虽然我的代码行为不端,但事实并非如此。

VS2005调试器没有正确显示QList中的内容。

正如davmac建议的那样,当你打印出来的东西时,它可以正常工作。

而davmac,请不要指出,当这个人给你一段代码试试时,他可能会有内存损坏。如果您无法使用相同的设置尝试,那就是另一回事了。

答案 1 :(得分:0)

“entry.name”不是指针 - 它被声明为QString,在这里:

public: QString name;

那么,“entry.name将成为一个坏指针”是什么意思?

最有可能的是,程序的其他部分导致内存损坏。

答案 2 :(得分:0)

我假设,QStringList在其copy-ctor中创建字符串的深度副本。

我们知道QList没有深度复制。 see QListimplicit sharing

所以,在

的召唤下
void EntryWidget::setEntries(QStringList& names) {...}

复制名称中的字符串。

但是当你将新的 Entry -List设置为模型时,

m_model.setEntryData(list);

列表未复制到 mmodel.xy

现在您可以访问 mmodel.xy ,但您在 setEntries(..)中指定的字符串已被删除。 当你离开 setEntries(..)方法时,他们失去了范围。

注意: QString是String的引用指针。这被称为&#34;隐式共享&#34; 。 Qt中的所有容器都有懒惰评估的概念。 (可能除了 QStringList ,这会产生深度复制。这可能是Qt中的一个小错误。如果我看到.cpp,我只能说100%)

qt-project.org/doc/qt-5/qstringlist.html#QStringList-3