Ошибка получения подтверждения при ссылочном вызове - PullRequest
2 голосов
/ 19 августа 2010

(Отказ от ответственности: я удалил тег Qt на случай, если проблема в моем синтаксисе / понимании ссылок, задействованных здесь)

У меня есть foreach петля с объектом Member. Когда я перебираю список и пытаюсь получить доступ к полю участника, отладчик останавливается, и я получаю сообщение:

Stopped: 'signal-received' -

Ошибка подтверждения:

inline QString::QString(const QString &other) : d(other.d)
{ Q_ASSERT(&other != this); d->ref.ref(); }

Я проверил, является ли член NULL, и это не так. Я попытался заново обработать код, но мне не удается выполнить этот простой вызов.

Я кое-что упустил. MemberList - это одноэлементный файл (определенно инициализированный и возвращающий действительный указатель), который создается при запуске приложения и заполняет MemberList членами из файла. Когда это создано, определенно есть значения, поскольку я печатаю их в qDebug(). Эта страница буквально следующая страница. Я не уверен, как уничтожить элементы списка.

Код выглядит следующим образом:

int i = 0;

QList<Member*> members = ml->getMembers();

foreach (Member* mem, members)
{
    QString memID = mem->getMemberID(); // Crash happens here

    QListWidgetItem *lstItem = new QListWidgetItem(memID, lsvMembers);
    lsvMembers->insertItem(i, lstItem);
    i++;
}   

Классы Member получают следующим образом:

QString getMemberID() const;

и фактическая функция:

QString Member::getMemberID() const
{
    return MemberID;
}

Переменная ml получается следующим образом:

QList<Member*> MemberList::getMembers()
{
    return MemberList::getInstance()->memberList;
}

Где memberList - закрытая переменная.


Окончательный ответ:

Я решил полностью переделать синглтон и обнаружил, что не создаю экземпляр нового члена, а снова и снова использую предыдущий объект. Это вызвало двойную ссылку. Выбери вот указатели для тебя. Отдельное спасибо Troubadour за усилия!

1 Ответ

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

Если mem не равно нулю, это может быть случай, когда указатель свисает, т.е. Member, на который он указывал, был удален.

Если Member наследуется от QObject, тоВы можете временно изменить QList<Member*>, который хранится в ml (при условии, что это то, что хранится в ml), на QList< QPointer<Member> >.Если после вызова getMembers или в любой точке цикла вы получаете нулевой QPointer в списке, значит, объект должен был быть уничтожен в какой-то момент.

Редактировать

Что касается синглтона, вы уверены, что он правильно инициализирован?Другими словами, MemberList::getInstance() возвращает действительный указатель или только случайный неинициализированный указатель?

Edit2

Так как большинство возможностей исчерпаны, я думаю, это должно быть вгде-то синглтонВсе, что я могу предложить, это продолжать запрашивать первый элемент в списке, чтобы точно определить, где он идет плохо.

...