如何在不使用malloc或new运算符的情况下分配内存空间?

时间:2011-04-24 16:50:19

标签: c++

当我的朋友昨天接受采访时,他被问到一个问题: 实现一个不使用* alloc或new运算符来分配内存空间的函数,该函数应该返回一个指向该地址的指针。 他和我都找不到答案。

4 个答案:

答案 0 :(得分:17)

我认为问题更多的是一个难题,而不是一个展示编程经验的问题。我的解决方案是分配一个全局字节数组,用于代替堆:

char heap[MAX_ALLOWED_MEM];

/*
   The following function uses 'heap' as raw memory!
   void* like_malloc(size_t bytes);
   ...
*/

答案 1 :(得分:3)

根据您的平台,您有以下几种选择:

  • 由于这是C ++,你可以作弊并调用其中一个 STL allocators。我怀疑这是面试官想要的,但是谁 知道肯定吗?
  • 您可以随时使用固定大小的池作为建议的几个答案。
  • sbrk也是一种选择,但不鼓励使用它,而且不再使用它 POSIX的一部分。
  • 您也可以使用mmap(或VirtualAllocCreateFileMapping 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;
        }
}