QVector + QScopedPointer - недопустимый параметр, переданный в функцию времени выполнения C - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть метод, который генерирует огромный QVector<uchar> (РАЗМЕР: 354792000), и память выделяется / освобождается динамически, для удобства я использую QScopedPointer:

void someMethod(int SIZE) {
  chVec.reset(new QVector<uchar>(SIZE));
       /*doing some stuff with an array...*/
  chVec.data()->clear();
  chVec.data()->squeeze();
}

Создание массивов небольшого размера- нет проблем, вы также можете создать один массив большого размера, но когда я снова вызываю метод, я получаю сообщение об ошибке «Недопустимый параметр, переданный функции времени выполнения C». Он прошел через отладчик, при попытке выделить место для нового массива возникает ошибка:

template <typename T>
QVector<T>::QVector(int asize, const T &t)
{
    Q_ASSERT_X(asize >= 0, "QVector::QVector", "Size must be greater than or equal to 0.");
    if (asize > 0) {
        d = Data::allocate(asize);
        Q_CHECK_PTR(d); /*<------ Error occured*/
        d->size = asize;
        T* i = d->end();
        while (i != d->begin())
            new (--i) T(t);
    } else {
        d = Data::sharedNull();
    }
}

Data :: allocate (asize);:

Q_REQUIRED_RESULT static QTypedArrayData *allocate(size_t capacity,
            AllocationOptions options = Default)
    {
        Q_STATIC_ASSERT(sizeof(QTypedArrayData) == sizeof(QArrayData));
        return static_cast<QTypedArrayData *>(QArrayData::allocate(sizeof(T),
                    Q_ALIGNOF(AlignmentDummy), capacity, options));
    }     

Что бы это могло быть? Утечка памяти (невозможно выделить такой большой кусок непрерывной памяти снова, так как предыдущий вызов не освободил память?)? ... Я просто не могу понять, в чем проблема, перед тем как покинуть область действия метода, я даже вручную очищаю массив и освобождаю память ... Буду благодарен за любой совет

1 Ответ

0 голосов
/ 03 ноября 2019

Проблема была решена путем изменения mingw32 на mingw64

...