Привет я пытаюсь отправить QList в качестве параметра в другой класс, но по какой-то причине я получил нарушение прав чтения …
CompareTimeChannel.h
class CompareTimeChannel : public IDataChannel
public:
// @brief The method used to receive the list
void setData(const QList< QSharedPointer<core::ITrackSection> > & sections);
// @brief The list
QList< QSharedPointer<core::ITrackSection> > _sections;
};
CompareTimeChannel.cpp
// @brief Empty constructor
CompareTimeChannel::CompareTimeChannel()
{
}
void CompareTimeChannel::setData(const QList< QSharedPointer<core::ITrackSection> > & sections)
{
//_sections = *new QList< QSharedPointer<core::ITrackSection> > ();
_sections.clear();
_sections.append(sections);
}
Запуск этого кода приведет к Exception at 0x31cc78d, code: 0xc0000005: read access violation at: 0x4, flags=0x0
на _sections.clear();
Я пытался инициализировать список раньше (закомментированная строка _sections = *new QList<...>
) но исключение выдается то же самое.
Ответ был бы очень признателен …
РЕДАКТИРОВАТЬ
Хорошо, это исправлено!
Во-первых, как сказал @AndreasT, мне нужно было инициализировать конструктор QList по умолчанию.
Тогда, согласно ответу @ 10WaRRioR01, проблема возникает из CompareTimeChannel
который не был инициализирован при первом вызове метода. Исправлено с помощью:
CompareTimeChannel* chan = static_cast<CompareTimeChannel*>(channel);
Q_ASSERT(chan);
if (chan) {
chan->setData(sections);
}
else {
qDebug() << "Dynamic cast failure";
}
Спасибо всем, ребята!
//_sections = *new QList< QSharedPointer<core::ITrackSection> > ();
Ты никогда не должен делать что-то подобное. Это создает новый экземпляр QList в куче, и он никогда не будет удален, поэтому у вас есть утечка памяти
Вы должны были сделать
_sections = QList< QSharedPointer<core::ITrackSection> > ();
вместо этого, и это было бы законно. Но самый простой способ — использовать назначение копирования, подобное этому
_sections = sections
Скорее всего, проблема, с которой вы столкнулись, связана с данными, имеющимися в _sections. Возможно, вы вызываете ваши методы для нулевого объекта CompareTimeChannel
Вы должны инициализировать разделы в конструкторе.
Прокомментированная строка просто ужасно неправильна.
new
создает список в куче, то вы разыменовываете, что с *new
и присваивание неявно вызывает конструктор копирования нового списка в куче и копирует его в экземпляр. Но что-то в куче все еще странно, так что вы только что создали утечку памяти.
// @brief Empty constructor
CompareTimeChannel::CompareTimeChannel()
:_sections() // initialization default constructor.
{
}
Изменить относительно комментария:
Метод QList.clear () вызывает деструкторы каждого элемента списка. По крайней мере, один из ваших общих указателей, похоже, не инициализирован правильно. Если вам нужна дополнительная информация, пожалуйста, вставьте код, который помещает материал в _sections.
Изменить относительно исключения:
Как я уже сказал, проблема, скорее всего, в том, что общие указатели не устанавливают ничего интересного. Когда SP уничтожается, он вызывает деструктор своего контента, который должен существовать, в противном случае он вызывает нарушение прав чтения, что объясняет симптомы.
Это то, что вы показали, должно работать. Ваша проблема в другом месте.
Проблемы такого рода могут быть вызваны множеством разных ошибок, таких как: плохо static_cast
или неудачное приведение в стиле c, нарушение бинарной совместимости при использовании динамических библиотек, запись вне таблицы, проблемы с кешем компилятора (такое случается довольно часто, поэтому вы можете это исправить ниже).
Первое, что я хотел бы сделать:
make clean
qmake
make
Это решает такую проблему довольно часто. если я не помогу, вам придется найти другие проблемы в вашем коде.