我正在编写一个简短的程序,我需要首先在其中一个结构阵列,如果用户要求其他人以其他方式进行分配,则分配给予他们的解决方案(我已经证明了这一点),但是当我realloc()其中一个重新分配入侵了其他人的空间,使其无法使用...
我该如何避免这个问题???
您正在做的是涉及未定义的行为,至少建议。如果您需要对这样的内存块进行细粒度的控制,则需要要求系统的内存分配器给您一个大块来管理自己。
系统分配器与您的线程和您拨打的任何系统或其他分配调用之间共享(例如strdup)。REALLOC发生的重新排序是由于Realloc必须首先分配新块,然后在使旧块可用之前将旧数据复制到其中引起的事实。但是,同样的问题将在您应用程序的一生中其他地方发生。
也有许多内存策略。某些内存分配器实际上将分配一个比您要求的较大块,并使用额外的空间提供有关分配的信息。例如。当您要求16个字节时,它们分配了16 sizeof(size_t),并存储它们返回给您的地址的分配的大小:
void* malloc(size_t bytes)
{
uint32_t* block = _internal_malloc(bytes + sizeof uint32_t);
*block = bytes;
return &block[1]; // return a pointer to after the size we stored.
}
内存分配器也倾向于在操作系统版本之间发生变化,因此依靠其行为是一个非常糟糕的主意。
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main() {
char* a = malloc(32);
char* b = malloc(32);
char* s = strdup("hello");
char* c = malloc(32);
printf("a = %p, b = %p (a + 32 = %p), c = %p (b + 32 = %p)n", a, b, a+32, c, b + 32);
// your code goes here
return 0;
}
输出:
a = 0x83af008, b = 0x83af030 (a + 32 = 0x83af028), c = 0x83af068 (b + 32 = 0x83af050)
您可以看到这些块是按顺序进行的,但不连续,由于strdup,B和C之间也存在延长的差距。
另一个可能影响排序的问题是免费池的分散。
http://ideone.com/cbafzm
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main() {
char* a = malloc(32);
char* b = malloc(32);
char* s = strdup("hello");
free(s);
char* c = malloc(32);
printf("a = %p, b = %p (a + 32 = %p), c = %p (b + 32 = %p)n", a, b, a+32, c, b + 32);
// your code goes here
return 0;
}
在这里,即使我们 free
d s,我们也分配了造成拆分的分配,当我们要求相等或较小的分配时,我们只会收回该地址。