我已经达到了realloc停止返回指针的地步 - 我假设数组没有足够的空间来扩展或移动。唯一的问题是我真的需要这种内存来存在或应用程序无法按预期运行,所以我决定尝试malloc - 因为realloc无法正常工作,所以期待它不起作用 - 但它确实如此。为什么?如何重新分配不工作,但malloc可以吗?
然后我将指针数组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;
}
}
}
我所有修补程序后,代码可能inits。这里有趣的是,在对数组进行分类之后,我用malloc分配了一个巨大的数组,因此将这些数组重新排列成一个数组,以用作GL_ARRAY_BUFFER。如果realloc由于缺少空间而没有分配,那么为什么不分配?
最后,无论如何这最终导致它崩溃。一旦它崩溃后,通过渲染功能。如果我删除了所有的修复程序,并在realloc未分配时捕获它,则可以正常工作。这引发了这个问题,mallocing我的数组有什么问题,而不是重新分配导致进一步下降的问题?
我的数组的指针是浮点指针。当我增长数组时,它被转换为一个指向浮点数并重新分配的指针。我在Android上构建,所以这就是为什么我认为那里缺乏内存。
在看不到代码的情况下很难理解问题所在。你能否包含一些关于你使用memcpy的内容?实际的realloc和malloc调用? – 2011-05-10 14:32:02
听起来像这里工作的错误。无论是在你的代码中,还是在CRT中(不太可能)。 – 2011-05-10 14:36:11
你在混合'size'变量的含义吗?它是以字节为单位的数组大小还是数组中的浮点数? – James 2011-05-10 15:20:25