2013-11-08 2 views
1

Я думаю, это не столько вопрос, сколько просьба о комментариях.bad_alloc с QVector, но не с std :: vector

Сегодня я пытался загрузить более крупный набор данных в свое программное обеспечение и столкнулся с несколькими плохими выделениями.

Таким образом, соответствующий код выглядит следующим образом.

QVector<float>verts; 
try 
{ 
    verts.reserve(numPoints * 6); 
} 
catch (std::bad_alloc&) 
{ 
    qDebug() << "error"; 
} 

NumPoints в данном случае 92911773 поэтому он будет пытаться выделить NumPoints * 6 * SizeOf (с плавающей точкой) = 2,214,922,152 байт. Моя машина работает с 64-битным Linux с 12 ГБ оперативной памяти. Так что это не должно быть проблемой.

Таким образом, это исключает исключение bad_alloc. Теперь, если я изменю QVector на std :: vector, он будет работать. Может кто-нибудь прокомментировать это?

ответ

1

Не глядя на определение QVector, я собираюсь предположить, что это потому, что Qt использует int для представления размера.

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

std::vector делает правильную (и нормальную) вещь и использует size_t для представления размера, поэтому он не переполняется.

+0

Doh, возможно, видел это сам. – Roest

+0

log (6 * 92911773)/log (2) = 29,05 ..., поэтому простой счетчик предметов должен комфортно вписываться в 32-битный int –

+0

Кажется, внутренние элементы QVector также 32-разрядные: -/ –

 Смежные вопросы

  • Нет связанных вопросов^_^