我对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,一切正常。
有什么想法吗?感谢
答案 0 :(得分:1)
我遇到了同样的问题,并且正在寻找避孕者。
我虽然我的代码行为不端,但事实并非如此。
VS2005调试器没有正确显示QList中的内容。
正如davmac建议的那样,当你打印出来的东西时,它可以正常工作。
而davmac,请不要指出,当这个人给你一段代码试试时,他可能会有内存损坏。如果您无法使用相同的设置尝试,那就是另一回事了。
答案 1 :(得分:0)
“entry.name”不是指针 - 它被声明为QString,在这里:
public: QString name;
那么,“entry.name将成为一个坏指针”是什么意思?
最有可能的是,程序的其他部分导致内存损坏。
答案 2 :(得分:0)
我假设,QStringList在其copy-ctor中创建字符串的深度副本。
我们知道QList没有深度复制。 see QList和implicit 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