realloc がポインターを返さなくなるポイントに到達しました。配列を拡張または移動するためのスペースが不足していると思います。唯一の問題は、そのメモリが存在する必要があるか、アプリケーションが期待どおりに実行できないことです。そのため、malloc を試すことにしました。なんで?
次に、ポインターの配列を新しく割り当てられた配列に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 を使用して巨大な配列を割り当て、配列を 1 つの配列に並べ替えて GL_ARRAY_BUFFER として使用することです。スペース不足のために realloc が割り当てられていない場合、なぜ割り当てられないのでしょうか?
最後に、これにより最終的にクラッシュします。クラッシュしたらレンダリング機能を通過した後。すべての修正を削除し、realloc が割り当てられないときにキャッチした場合、問題なく動作します。これは疑問を投げかけます.私の配列を再割り当てする代わりにmallocすることの何が問題なのですか?
私の配列は、フロートのポインターのポインターです。配列を大きくすると、浮動小数点数へのポインターに変換され、再割り当てされます。私は Android でビルドしているため、メモリが不足していると想定しました。