QList ведет себя странно - PullRequest
       2

QList ведет себя странно

2 голосов
/ 24 августа 2010

У меня нет большого опыта работы с 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.

Есть идеи? Спасибо

Ответы [ 3 ]

1 голос
/ 01 ноября 2010

У меня была такая же проблема, и я искал anwsers.

Я думал, что мой код плохо себя вел, когда его нет.

Отладчик VS2005 неправильно отображает данные в QList.

И, как предположил Давмак, когда вы распечатываете материал, он отлично работает.

И Давак, пожалуйста, не указывайте, что у него может быть повреждение памяти, когда парень дает вам кусок кода, чтобы попробовать. Если вы не можете попробовать его с той же настройкой, это другое дело.

0 голосов
/ 11 апреля 2014

Я предполагаю, что QStringList делает копию глубины строк в своем copy-ctor.

И мы знаем, что QList не делает копий глубины. см. QList и неявное совместное использование

Итак, при вызове

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

Строки в имена копируются.

Но когда вы устанавливаете новый Entry -List для модели,

m_model.setEntryData(list);

список не копируется в mmodel.xy .

Теперь вы можете получить доступ к mmodel.xy , но строки, которые вы назначаете в setEntries (..) , уже удалены.Они теряют свою область видимости, когда вы покидаете метод setEntries (..) .

Примечание: QString является ссылочным указателем на строку.Это называется «неявное разделение».И все контейнеры в Qt имеют концепцию отложенной оценки.(Вероятно, за исключением QStringList , который делает глубинное копирование. Это, возможно, небольшая ошибка в Qt. Я могу сказать только 100%, если я вижу .cpp)

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

0 голосов
/ 25 августа 2010

«entry.name» не указатель - он объявлен как QString, здесь:

public: QString name;

Итак, что вы подразумеваете под "entry.name станет плохим указателем"?

Скорее всего, какая-то другая часть вашей программы вызывает повреждение памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...