当我的朋友昨天接受采访时,他被问到一个问题: 实现一个不使用* alloc或new运算符来分配内存空间的函数,该函数应该返回一个指向该地址的指针。 他和我都找不到答案。
答案 0 :(得分:17)
我认为问题更多的是一个难题,而不是一个展示编程经验的问题。我的解决方案是分配一个全局字节数组,用于代替堆:
char heap[MAX_ALLOWED_MEM];
/*
The following function uses 'heap' as raw memory!
void* like_malloc(size_t bytes);
...
*/
答案 1 :(得分:3)
根据您的平台,您有以下几种选择:
sbrk
也是一种选择,但不鼓励使用它,而且不再使用它
POSIX的一部分。mmap
(或VirtualAlloc
或CreateFileMapping
Windows)作为内存的来源,但如果你想要更小的内存块
比起整个页面,你仍然需要编写一些代码来管理
记忆这些功能返回。您的分配器应确保为您的平台正确对齐内存:
在某些系统上,未对齐的内存访问是一个无效的操作并且打开
其他人的表现受到影响而且对齐访问权限。在实际中,生产
代码你也可能想要提供free
操作以避免服用
在所有系统的内存和锁定上使您的堆线程安全。
答案 2 :(得分:2)
您可以通过系统调用(如sbrk())来完成,而不是使用C库函数或C ++语言功能。但是,绝对没有理由这样做,所以这是一个非常糟糕的问题。
答案 3 :(得分:1)
一个永远不会释放的超级简单。
class allocator{
static char mem_pool[1048576];
char* place;
public:
allocator(){
place = mem_pool;
}
allocator(const allocator& a){
place = a.place;
}
char* alloc(size_t size){
char* ret = place;
place += size;
return ret;
}
}