gpt4 book ai didi

c - 依次进行一些 malloc() ,然后对其中之一进行重新分配???

转载 作者:行者123 更新时间:2023-11-30 15:39:31 25 4
gpt4 key购买 nike

我正在编写一个简短的程序,我需要首先 malloc 一个结构数组,如果用户要求 malloc 其他人,则分配会相应地给出它们的地址(我已经证明了这一点),但是当我 realloc() 时其中一个的重新分配侵入了其他的空间,使它们无法使用......

我该如何避免这个问题???

最佳答案

您正在做的事情涉及未定义的行为,并且至少是不明智的。如果你需要像这样对内存块进行细粒度的控制,你需要要求系统的内存分配器给你一个大块来自己管理。

系统分配器在您的线程和任何系统或您进行的其他分配调用(例如 strdup)之间共享。 realloc 发生的重新排序是由于 realloc 必须首先分配一个新 block ,然后在使旧 block 可用之前将旧数据复制到其中。但同样的问题也会在应用程序生命周期的其他地方发生。

还有许多内存分配器策略。一些内存分配器实际上会分配比您请求的稍大的 block ,并使用额外的空间来提供有关分配的信息。例如。当您请求 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)

您可以看到这些 block 是按顺序排列的,但不连续,由于 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;
}

在这里,即使我们释放d,我们也已经对分配进行了碎片化,从而导致了 split ,并且只有当我们请求相等或更小的分配时,我们才会取回该地址。

关于c - 依次进行一些 malloc() ,然后对其中之一进行重新分配???,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21417386/

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