2011-04-24 71 views
6

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

+7

多么愚蠢的问题。我希望为你着想,你没有得到这份工作! – 2011-04-24 16:51:40

+0

@David:或者朋友。 – 2011-04-24 17:07:54

+1

对不起,这个问题让你们感到很蠢。不过,我得到了答案,并得到了改善。我认为它比无知更愚蠢。 – qwerty 2011-04-24 17:25:47

回答

15

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

char heap[MAX_ALLOWED_MEM]; 

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

+1。聪明:) .. – 2011-04-24 16:59:54

+0

是的,我会把它看作更多的益智游戏,就像你想象的那样在盒子外面。在这些类型的问题上,尽量列出尽可能多的解决方案并讨论它们的优缺点,无论多远。识别更多选项是衡量您的专业知识的一个指标。面试的人会做出某种决定:1)没有答案,没有基本的技能水平。 2)至少有一些想法=一些技巧和问题解决,3)讨论问题的解决方案,包括性能,线程安全性,可移植性=更高级的经验。 – DavidN 2011-04-24 17:01:53

+3

这与外部思考无关,这是一个编程知识问题,因为这或多或少是如何在裸机系统中创建堆的(您可以使用预定义的内存映射部分而不是让编译器生成一个全局的,一旦你知道内存映射)。问题是,“如果被要求这样做,你有没有可能写内存分配器的程序员?”,而真正的工作是编写函数(以及随附的'free'')。如果你不是,也许他们想要一个低级别的程序员来完成这项工作。 – 2011-04-24 19:17:25

2

您可以通过系统调用(如sbrk())来执行此操作,而不是使用C库函数或C++语言功能。但是,这样做绝对没有理由,所以这是一个非常糟糕的问题。

+0

如果您需要由文件支持的内存,该怎么办?你如何从malloc或new中获取? – LnxPrgr3 2011-04-24 17:32:29

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; 
     } 
} 
+1

好主意,但在一个带有几个静态局部变量的函数中安全地执行它会更容易。因为你的拷贝构造函数会邀请人们将重叠的内存区域返回给alloc的后续调用者。 – 2011-04-26 04:18:38

3

根据您的平台上,你有几个选择:

  • 由于这是C++,你可以欺骗和调用的 STL allocators之一。我怀疑这是面试官想要的,但是谁肯定知道?
  • 您总是可以使用固定大小的池作为几个答案建议。
  • sbrk也是一种选择,但它的使用是不鼓励的,它不再是POSIX的 的一部分。
  • 你也可以(在 Windows或VirtualAllocCreateFileMapping)使用mmap作为存储源,但如果你想的内存块不是整个页面的小 你仍然需要编写一些代码来管理 存储这些功能返回。

你分配器应确保存储器正确地为您的平台一致: 在某些系统上,对齐的内存访问是无效操作上 人有一个性能命中与对齐访问。在实际中,生产 代码您也可能希望提供free操作以避免在整个系统的内存和锁定上执行 以使堆保持线程安全。

+0

...或共享内存。 – 2011-04-26 04:16:18

相关问题