c用于自定义内存区域的malloc功能

问题描述 投票:1回答:4

是否有任何malloc / realloc / free类似的实现,我可以指定一个内存区域来管理内存分配?

我的意思是常规的malloc(等)函数只管理堆内存区域。如果我需要在共享内存段或内存映射文件中分配一些空间怎么办?

c memory-management shared-memory gnu mmap
4个回答
1
投票

不是100%,根据您的问题,您希望维护自己的内存区域。所以你需要去自己的my_mallocmy_reallocmy_free

实施自己的my_malloc可能对您有所帮助

void* my_malloc(int size)    
{
    char* ptr = malloc(size+sizeof(int));
    memcpy(ptr, &size, sizeof(int));
    return ptr+sizeof(int); 
}

这只是一个小小的想法,全面实施将带您回答。

Refer this question

使用相同的方法来实现my_reallocmy_free


1
投票

我最近也问自己这个问题,因为我想要一个针对我的安全程序的malloc实现,它可以在退出之前安全地擦除静态内存区域(其中包含加密密钥,密码和其他此类数据等敏感数据)。

首先,我找到了this。我认为这对我的目的来说非常好,但我真的无法完全理解它的代码。许可证状态也不清楚,因为它对我的一个项目也非常重要。

我最后写了my own。我自己的实现同时支持多个堆,使用池描述符结构对它们进行操作,释放块的自动内存清零,未定义的行为和OOM处理程序,获得分配对象的确切可用大小以及测试仍然分配指针,这是非常充分的为了我。它不是很快,而且是教育级别而不是专业级别,但我想要一个匆忙。

请注意,它(尚未)知道对齐要求,但至少它返回一个适合存储32位整数的地址。


0
投票

我使用Tasking,我可以将数据存储在特定的内存空间中。例如,我可以使用:

testVar _at(0x200000);

我不确定这是否是您正在寻找的,但是例如我用它来将数据存储到外部RAM。但据我所知,它只适用于全局变量。


0
投票

实现自己的my_allocmy_free并使用首选内存范围并不是很难。它是一个简单的链:块大小,无标记/正在使用,以及块数据加上最终块标记(例如块大小= 0)。一开始你有一个大的空闲块并知道它的地址。请注意,my_alloc返回块数据的地址,块大小/标志是之前的几个字节。

© www.soinside.com 2019 - 2024. All rights reserved.