Я достиг точки, когда realloc перестает возвращать указатель - я предполагаю, что не хватает места для расширения или перемещения массива. Единственная проблема в том, что мне действительно нужно, чтобы эта память существовала, иначе приложение не может работать должным образом, поэтому я решил попробовать malloc — ожидая, что это не сработает, поскольку realloc не сработает — но это сработало. Почему?
Затем я memcpy массив указателей в новый выделенный массив, но обнаружил, что это сломало его, указатели, такие как 0x10 и 0x2b, были помещены в массив. Есть настоящие указатели, но если я заменю memcpy на цикл for, это исправит ситуацию. Почему memcpy сделал это? Должен ли я не использовать memcpy в своем коде?
Код:
float * resizeArray_by(float *array, uint size)
{
float *tmpArray = NULL;
if (!array)
{
tmpArray = (float *)malloc(size);
}
else
{
tmpArray = (float *)realloc((void *)array, size);
}
if (!tmpArray)
{
tmpArray = (float *)malloc(size);
if (tmpArray)
{
//memcpy(tmpArray, array, size - 1);
for (int k = 0; k < size - 1; k++)
{
((float**)tmpArray)[k] = ((float **)array)[k];
}
free(array);
}
}
return tmpArray;
}
void incrementArray_andPosition(float **& array, uint &total, uint &position)
{
uint prevTotal = total;
float *tmpArray = NULL;
position++;
if (position >= total)
{
total = position;
float *tmpArray = resizeArray_by((float *)array, total);
if (tmpArray)
{
array = (float **)tmpArray;
array[position - 1] = NULL;
}
else
{
position--;
total = prevTotal;
}
}
}
void addArray_toArray_atPosition(float *add, uint size, float **& array, uint &total, uint &position)
{
uint prevPosition = position;
incrementArray_andPosition(array, total, position);
if (position != prevPosition)
{
float *tmpArray = NULL;
if (!array[position - 1] || mHasLengthChanged)
{
tmpArray = resizeArray_by(array[position - 1], size);
}
if (tmpArray)
{
memcpy(tmpArray, add, size);
array[position - 1] = tmpArray;
}
}
}
После всех моих исправлений код, вероятно, инициализируется. Интересно то, что после сортировки массивов я выделяю с помощью malloc огромный массив, чтобы переупорядочить массивы в один массив, который будет использоваться как GL_ARRAY_BUFFER. Если realloc не выделяет из-за нехватки места, то почему не выделяет?
Наконец, это все равно приводит к сбою в конце. После прохождения функции рендеринга один раз происходит сбой. Если бы я удалил все свои исправления и просто поймал, когда realloc не выделяет, это сработало бы нормально. Напрашивается вопрос, что плохого в распределении моего массива вместо перераспределения, чтобы вызвать проблемы в будущем?
Мой массив - это указатель указателей поплавков. Когда я увеличиваю массив, он преобразуется в указатель на числа с плавающей запятой и перераспределяется. Я собираю на Android, поэтому я предположил, что не хватает памяти.