QVector + QScopedPointer - Недопустимый параметр передан функции времени выполнения C

У меня есть метод, который генерирует огромный QVector<uchar> (SIZE: 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();
    }
}

Данные :: выделить (размер); :

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));
    }     

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


person Cataract    schedule 03.11.2019    source источник
comment
Не из-за фрагментарной ли памяти? каково пространство виртуальной памяти вашего процесса? Вы исследовали след распределения памяти вашего процесса?   -  person Soheil Armin    schedule 03.11.2019
comment
@Soheil Спасибо за ваш ответ. Я решил свою проблему, поменяв mingw32 на mingw64, при том, что моя программа не превышала размер 2 Гб - у меня была беда с badAlloc   -  person Cataract    schedule 03.11.2019


Ответы (1)


Проблема решилась заменой mingw32 на mingw64

person Cataract    schedule 03.11.2019
comment
так это была проблема с фрагментацией памяти? наверняка, 2 Гб памяти могли быть фрагментированы раньше. - person Soheil Armin; 03.11.2019
comment
@Soheil, ну, похоже, проблема в этом, но я не могу сказать это точно. , а при освобождении памяти стало 200 мб обратно. Я предполагаю: qt выделяет/освобождает место во время жизни программы, и это может привести к тому, что будет невозможно выделить большую часть непрерывной памяти для односвязного списка... но это только мои мысли (Извините за мой английский) - person Cataract; 03.11.2019
comment
Фрагментация памяти может произойти при любом потреблении памяти. Дело не в том, сколько используется или выделено памяти. Речь идет о том, как память распределяется через пространство виртуальной памяти. Итак, я предполагаю, что это была фрагментация памяти. - person Soheil Armin; 03.11.2019
comment
@Soheil Я только что прочитал об этом и предполагаю, что вы правы. Спасибо. Есть ли способ управлять фрагментацией (размером кластера?) во время выполнения? Или единственное решение состоит в том, чтобы зарезервировать дополнительное пространство и не освобождать его до тех пор, пока не вызовет деструктор программы? - person Cataract; 03.11.2019
comment
Я не уверен, что это работает. Поможет резервирование непрерывной части памяти для вашего QVector на ранних стадиях выполнения вашей программы. И речь идет об пространстве виртуальной памяти, которым управляет ваша ОС, а не о физической оперативной памяти. - person Soheil Armin; 03.11.2019
comment
@Soheil Поможет резервирование непрерывной части памяти для вашего QVector на ранних этапах выполнения вашей программы. Это то же самое, что я только что написал - зарезервируйте дополнительное пространство и не освобождайте его, пока не вызовет деструктор программы. Дело в том, что я не знаю, сколько места мне понадобится. Я мог бы повторно использовать эту выделенную память, но держать большой блок памяти на протяжении всего жизненного цикла программы - не лучшая идея. Я думаю, что мне следует больше узнать о mingw, выделении памяти в qt-framework и поддержке больших адресов. - person Cataract; 03.11.2019