У меня есть простой матричный класс, который я создал для использования с opengl (es 2.0, afaik нет встроенной версии для этой конкретной версии opengl).
Это в основном не более чемвектор, размер которого в конструкторе содержит 16 чисел с плавающей запятой (я выбрал вектор из всего лишь массива с 16 поплавками для имеющегося у него оператора =) и некоторые вспомогательные функции, которые полезны в контексте opengl.В любом случае, одна из этих вспомогательных структур загружает единичную матрицу в вектор:
void Matrix::loadIdentity()
{
matrix.resize(16, 0);
for(int i = 0; i < 16; i++)
matrix[i] = 0.0f;
for(int i = 0; i < 4; i++) {
matrix[i * 4 + i] = 1.0f;
}
}
Где матрица:
std::vector<float>
Строка, которая говорит:
matrix.resize(16, 0);
предназначен для того, чтобы убедиться, что размер на самом деле составляет 16 операций с плавающей запятой, хотя это также сделано в конструкторе, и я не верю, что в конечном счете это понадобится, но сейчас, чтобы устранить одну возможную ошибку, чтобы упростить жизньдля отладки.
Valgrind говорит мне, что эта функция, в частности эта строка:
matrix[i] = 0.0f;
вызывает неправильный размер записи 4, что подозрительно звучит так, как будто я как-то вызываю матрицу[16] = 0,0f ;.Однако я должен перейти только от 0 до 15. Интересно отметить, что valgrind также говорит, что рассматриваемая память, в которую записывается, была выделена деструктором матрицы и, более конкретно, деструктором вектора.
Address 0x150f8280 is 0 bytes inside a block of size 64 free'd 1: operator delete(void*) in /build/buildd/valgrind-3.6.1/coregrind/m_replacemalloc/vg_replace_malloc.c:387
2: __gnu_cxx::new_allocator<float>::deallocate(float*, unsigned long) in <a href="file:///usr/include/c++/4.5/ext/new_allocator.h:95" >/usr/include/c++/4.5/ext/new_allocator.h:95</a>
3: std::_Vector_base<float, std::allocator<float> >::_M_deallocate(float*, unsigned long) in <a href="file:///usr/include/c++/4.5/bits/stl_vector.h:146" >/usr/include/c++/4.5/bits/stl_vector.h:146</a>
4: std::_Vector_base<float, std::allocator<float> >::~_Vector_base() in <a href="file:///usr/include/c++/4.5/bits/stl_vector.h:132" >/usr/include/c++/4.5/bits/stl_vector.h:132</a>
5: std::vector<float, std::allocator<float> >::~vector() in <a href="file:///usr/include/c++/4.5/bits/stl_vector.h:314" >/usr/include/c++/4.5/bits/stl_vector.h:314</a>
6: Matrix::~Matrix() in <a href="file:///home/leif/MarbleMachine/core/matrix.h:6" >core/matrix.h:6</a>
Это кажется маловероятным, если это просто какой-то индекс из-за ошибки диапазона, поскольку, на самом деле, векторный объект - это прежде всего указатель на то, где массив находится в памяти (ну, есть другие вещитоже, но я пытаюсь подчеркнуть, что сам векторный объект (где будет храниться деструктор), кажется маловероятным, что он будет непрерывным в памяти с тем, где хранится фактический массив.Зачем деструктору требовать память, если все дело в том, чтобы высвободить память, которую использует объект, не приведет ли это просто к утечке памяти? Кстати, у класса матрицы нет явного деструктора, поэтому только неявный
Наконец, я знаю, что предыдущие ошибки в valgrind могут вызыватьБудущие ошибки, но единственными предыдущими ошибками являются недопустимый размер чтения и использование неинициализированных переменных внутри существующих библиотек (OpenGL и SDL), поэтому я считаю крайне маловероятным, что они вызывают повреждение кучи до того, как это произойдет.
Спасибо.