我已經達到了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