我已经到了 realloc 停止返回指针的地步——我假设数组没有空间来扩展或移动。唯一的问题是我真的需要该内存存在或应用程序无法按预期运行,所以我决定尝试 malloc - 期待它不起作用,因为 realloc 不起作用 - 但它确实如此。为什么?
然后我将指针数组memcpy到新分配的数组中,但发现它破坏了它,像0x10和0x2b这样的指针被放入了数组中。有真正的指针,但如果我用 for 循环替换 memcpy,就可以修复它。为什么 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 上构建,所以这就是我认为内存不足的原因。