LINUX.ORG.RU

QVector крешится в деструкторе.

 ,


0

1

Есть функция которая парсит строку в QVector int'ов и сохраняет этот вектор в членах данных класса. При выходе из функции приложение падает, как я понимаю в деструкторе локального стекового QVector'a. Пытал воспроизвести в небольшом консольном приложении. Все работает хорошо. Подскажите, куда копать. Думаю уже на порчу памяти или что нибудь в это роде. Вот код для примера:

#include <QVector>
#include <QDebug>


QVector<int> populate;

void pp1( const QVector<int>& p )
{
	populate = p;
}

void pp2()
{
	QVector<int> vec(4);
	
	vec[1] = 28;
	vec[2] = 36;
	vec[0] = 48;
	vec[3] = 12;
	
	pp1(vec);
}


int main()
{
	pp2();
	
	qDebug() << populate[0];
  
	qDebug() << "start";
}
На этом небольшом примере у меня ничего не падает, деструктор стекового вектора отрабатывает нормально.

★★

Маловероятно, что баг в самом QVector же, скорее всего порча памяти. Попробуй valgrind, что ли.

vasilenko ★★
()

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

и зачем этот пример тогда?

anonymous
()
Ответ на: комментарий от vasilenko

Да на самом деле порча памяти. Сделал распечатку вектора. Значения забиты мусором ближе к концу.

mio ★★
() автор топика

Вот код для примера:

На этом небольшом примере у меня ничего не падает

/0, бгг. Ты падающий минимальный пример приведи, телепаты-то в отпуске.

yoghurt ★★★★★
()

TC,

так:

QVector<int> vec(4);
	
vec[1] = 28;
vec[2] = 36;
vec[0] = 48;
vec[3] = 12;

лучше никогда не делать без крайней необходимости. Векторы придумали не для того, чтобы ходить по тем же граблам, что и в C-шных массивах. Используй append()/prepend()/insert()/push_back()/push_front() и т.д. А ещё лучше - std::vector и at() для доступа.

asaw ★★★★★
()
Ответ на: комментарий от asaw

лучше никогда не делать без крайней необходимости.

почему? проверки на границы там есть:

inline const T &QVector<T>::operator[](int i) const
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
  return d->begin()[i]; }

anonymous
()
Ответ на: комментарий от asaw

Твой «полезный» совет может существенно сказаться на производительности, поэтому в реальных проектах так как ты говоришь никто никогда не делает :)

Reset ★★★★★
()
Ответ на: комментарий от anonymous

почему? проверки на границы там есть:

в отладочной версии на этапе выполнения, как видно. а код лучше писать так, чтобы он был абсолютно надежен.

asaw ★★★★★
()
Ответ на: комментарий от Reset

Твой «полезный» совет может существенно сказаться на производительности

забавно. похоже, про правило 80/20 (80% кода выполняется 20% времени) ты никогда не слышал.

поэтому в реальных проектах так как ты говоришь никто никогда не делает :)

угу, именно поэтому и существуют названные мною функции. рукалицо. думай что пишешь.

asaw ★★★★★
()
Ответ на: комментарий от asaw

в отладочной версии на этапе выполнения, как видно. а код лучше писать так, чтобы он был абсолютно надежен

Лучше не писать такой код, который ведёт себя по-разному в дебажной и релизной сборке.

ilammy ★★★
()
Ответ на: комментарий от asaw

Они конечно существуют, но надо думать когда их использовать. Те де prepend, insert для вектора по понятным причинам не используются почти никогда, а at не нужен, так как в debug и так есть проверки как выше заметили. Push_back очень рекомендуется использовать в связке с предварительной аллокацией.

Reset ★★★★★
()
Ответ на: комментарий от Reset

ТС, похоже, уже до начала этого топика его послушал.

P.S. А потом они бегают по всему ЛОРу и орут какой опасный язык C++ и как на нем невозможно написать ничего надежного и быстрого.

asaw ★★★★★
()
Ответ на: комментарий от Reset

Push_back очень рекомендуется использовать в связке с предварительной аллокацией.

Разве в 21м веке реализации std::vector-ов переаллоцируют свой буффер каждый раз на каждый push_back? Я просто не знаю.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

This effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.

false ★★★★★
()
Ответ на: комментарий от false

В том то и дело, что в общем случае container size != container capacity.

Известно, что QVector-ы, например, при переаллокации выделают память с запасом, а не для (N + 1) элемента.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Может быть, просто вопрос был про std::vector, и мне тоже стало интересно.

false ★★★★★
()
Ответ на: комментарий от Reset

Вот и я об этом. push_back не такой уж и дорогой

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.