Я новичок в C ++ и Qt, и я пытаюсь инициализировать QVector, который является членом класса в списке инициализации класса, как:
MyClass::MyClass(QWidget *parent) : QMainWindow(parent) , myVector(QVector<double>(100))
Я ожидал, что QVector уже выделит 100 индексов, но когда я пытаюсь прочитать myVector[0]
Я получаю сообщение об ошибке «Необработанное исключение в 0x0143bf77 в test.exe: 0xC0000005: расположение чтения нарушения доступа 0x00000004». и программа останавливается на этой строке Qt:
inline T &QVector<T>::operator[](int i)
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
return data()[i]; }
То, что я считаю, показывает, что я пытаюсь получить доступ к членам, которые еще не распределены, поэтому я полагаю, что не правильно использую список инициализации. Я мог бы сделать это указатель и сделать new QVector(100)
в конструкторе, но я хочу узнать, что не так и как я могу исправить это.
Вы, вероятно, делаете что-то не так, как показано, потому что следующий код прекрасно работает для меня, и это должно по замыслу. Обратите внимание, что для первого элемента вы можете использовать удобство первый метод.
#include <QVector>
#include <QDebug>
int main()
{
QVector<double> myVector(QVector<double>(100));
qDebug() << "TEST FIRST:" << myVector.first();
return 0;
}
TEMPLATE = app
TARGET = main
SOURCES += main.cpp
TEST FIRST: 0
Как я отметил в комментарии, вы можете использовать резервный метод.
void QVector :: Reserve (int size)
Попытки выделить память как минимум для элементов размера. Если вы заранее знаете, насколько большим будет вектор, вы можете вызвать эту функцию, и если вы будете часто вызывать resize (), вы, вероятно, получите лучшую производительность. Если размер занижен, то худшее, что может случиться, это то, что QVector будет немного медленнее.
Единственная цель этой функции — предоставить возможность точной настройки использования памяти QVector. В общем случае вам редко потребуется вызывать эту функцию. Если вы хотите изменить размер вектора, вызовите resize ().
Итак, вы бы написали что-то вроде этого:
MyClass::MyClass(QWidget *parent)
: QMainWindow(parent)
{
myVector.reserve(100);
}
Однако, как я также отметил позже в комментарии, простой конструктор также должен работать следующим образом:
MyClass::MyClass(QWidget *parent)
: QMainWindow(parent)
, myVector(100)
{
}
То, что вы делаете, вызывает конструктор копирования (хотя для неявно разделяемого класса), поэтому он может быть пренебрежимо медленнее. Это как минимум больше кода, чем вам нужно.
Попробуйте что-то вроде этого:
QVector<double> * vect = new QVector<double>;
vect->reserve(100);
void QVector :: Reserve (int size)
Попытки выделить память как минимум для элементов размера. Если вы заранее знаете, насколько большим будет вектор, вы можете вызвать эту функцию, и если вы будете часто вызывать resize (), вы, вероятно, получите лучшую производительность. Если размер занижен, то худшее, что может случиться, это то, что QVector будет немного медленнее.
Единственная цель этой функции — предоставить возможность точной настройки использования памяти QVector. В общем случае вам редко потребуется вызывать эту функцию. Если вы хотите изменить размер вектора, вызовите resize ().
Но это только зарезервирует память, если вы хотите просмотреть ее, используйте fill(<double>)