- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经到了 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/
我是 C 的新手,在 Linux 中使用带有开关 gcc -g -std=c89 -Wall ... 的 gcc4.4.6 进行编程,我在许多函数深处遇到了这个错误我的程序名为 compute: **
今天阅读Rust subreddit时,我发现以下评论: jemalloc针对(多线程)速度而不是内存使用进行了优化 经过更多研究后,我发现还有更多选择(例如calloc)。 我想了解不同内存分配器的
相关代码: write(-1, "test", sizeof("test")); void * p = malloc(1024); void * p2 = malloc(510); w
我正在比较不同的 malloc 实现,我想比较它们的运行时间和内存使用情况。 特别是,我对运行时和最大常驻内存感兴趣。重要的是最大常驻内存将是真实的(没有代码段等)。 我不能使用像 valgrind
我承认这三个都有不同的含义。但是,我不明白这些具体情况适用于哪些特定情况。任何人都可以分享每个例子吗?谢谢。 malloc(sizeof(int)) malloc(size
GLib 文档推荐使用 GLib Slice Allocator 而不是 malloc: "For newly written code it is recommended to use the ne
我正在分配一个字符串 int main(){ int buf = 1024; char *input = malloc(sizeof(char*) * buf); //CODE
Here有一个关于 malloc 包的环境变量列表: MallocStackLogging MallocStackLoggingNoCompact MallocPreScribble MallocSc
总体问题:当您将通过malloc分配的返回值分配给一个指针时,您是否需要malloc该指针以及,还是您可以简单地声明并分配它? 例如,假设我有一个函数 foo,它在执行过程中使用 malloc 创建了
这个问题在这里已经有了答案: String assignment in C (4 个答案) 关闭 7 年前。 这是有问题的片段。 int main() { char** RESERV = (
任务是将一个二进制文件解析到内存中。但是,我事先不知道需要分配的内存量。 哪种方法更可取:在解析例程中进行多个小 malloc,或者首先遍历文件以确定所需的内存量,然后再次解析? 感谢任何提示。 最佳
我最近一直在尝试理解严格别名的一个特定方面,我认为我已经制作了尽可能最小的有趣代码。 (对我来说很有趣,就是这样!) 更新:根据到目前为止的答案,很明显我需要澄清这个问题。从某个角度来看,这里的第一个
我一直在为我创建的一个简单程序创建测试。我总是使用类似这样的方法检查使用 malloc 分配内存是否失败 int* ptr = malloc(sizeof(int) * x); if(!ptr){
我是 malloc 和对齐 malloc 的新手。我知道如何使用它们。但是,我不知道在什么情况下我们应该使用对齐的 malloc 而不是标准的 malloc。你能给我解释一下吗? 最佳答案 glibc
这样分配内存是不好的做法吗?: FOO *foo; while (!(foo = malloc(sizeof(FOO)))) ; 最佳答案 我不知道有什么不好的做法,但这种情况并不常见。 malloc
有人可以向我解释使用和不使用 malloc 创建结构之间的区别吗?什么时候应该使用 malloc,什么时候应该使用常规初始化? 例如: struct person { char* name;
假设我有一个类型 node_t typedef struct node{ char* value; struct node *next; }node_t; 当我想创建一个名为 n1 的
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
我对指针感到困惑。这是交换两个名称的代码。请看代码。考虑输入:hellohai(对于 d)和 asd(对于 e)。我得到的输出:asd 1ellohai 1ellohai #include #incl
我已经编写了这个函数(如下)。它应该逐行读取文件。编辑该行并将某些单词/字符放入各种功能中。然后将这些函数放入“entrant”结构的数组(malloc)中。 问题是,当我退出循环并尝试打印数组时,放
我是一名优秀的程序员,十分优秀!