gpt4 book ai didi

c++ - 怎么realloc不行,malloc可以呢?

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:44 25 4
gpt4 key购买 nike

我已经到了 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 未分配时被捕获,它将正常工作。这引出了一个问题,分配我的数组而不是重新分配会导致问题进一步发展有什么问题?

我的数组是 float 指针的指针。当我增长数组时,它被转换成一个指向 float 的指针并重新分配。我在 Android 上构建,所以这就是为什么我认为内存不足的原因。

最佳答案

从所有不同的信息来看(realloc 未找到内存,memcpy 行为异常,崩溃)这听起来很像堆损坏。如果没有一些代码示例可以准确说明您在做什么,则很难确定,但您似乎在某些时候错误地管理了内存,导致堆进入无效状态。

您是否能够在 Linux 等替代平台上编译您的代码(您可能需要 stub 一些 android 特定的 API)?如果是这样,您可以查看该平台上发生的情况和/或使用 valgrind 来帮助追查它。

最后,既然你有这个标记的 C++,为什么你要使用 malloc/realloc 而不是 vector(或其他标准容器)或 new

关于c++ - 怎么realloc不行,malloc可以呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com