当我的朋友昨天接受采访时,他被问到一个问题: 实现一个不使用* alloc或new运算符来分配内存空间的函数,函数应返回一个指向该地址的指针。 他和我都不能找到答案。如何在不使用malloc或new运算符的情况下分配内存空间?
回答
我认为这个问题更多的是一个难题,而不是一个显示编程经验的问题。我的解决方案是分配一个全局字节数组,用来代替堆:
char heap[MAX_ALLOWED_MEM];
/*
The following function uses 'heap' as raw memory!
void* like_malloc(size_t bytes);
...
*/
+1。聪明:) .. – 2011-04-24 16:59:54
是的,我会把它看作更多的益智游戏,就像你想象的那样在盒子外面。在这些类型的问题上,尽量列出尽可能多的解决方案并讨论它们的优缺点,无论多远。识别更多选项是衡量您的专业知识的一个指标。面试的人会做出某种决定:1)没有答案,没有基本的技能水平。 2)至少有一些想法=一些技巧和问题解决,3)讨论问题的解决方案,包括性能,线程安全性,可移植性=更高级的经验。 – DavidN 2011-04-24 17:01:53
这与外部思考无关,这是一个编程知识问题,因为这或多或少是如何在裸机系统中创建堆的(您可以使用预定义的内存映射部分而不是让编译器生成一个全局的,一旦你知道内存映射)。问题是,“如果被要求这样做,你有没有可能写内存分配器的程序员?”,而真正的工作是编写函数(以及随附的'free'')。如果你不是,也许他们想要一个低级别的程序员来完成这项工作。 – 2011-04-24 19:17:25
您可以通过系统调用(如sbrk())来执行此操作,而不是使用C库函数或C++语言功能。但是,这样做绝对没有理由,所以这是一个非常糟糕的问题。
如果您需要由文件支持的内存,该怎么办?你如何从malloc或new中获取? – LnxPrgr3 2011-04-24 17:32:29
超级简单的永远不会释放。
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;
}
}
好主意,但在一个带有几个静态局部变量的函数中安全地执行它会更容易。因为你的拷贝构造函数会邀请人们将重叠的内存区域返回给alloc的后续调用者。 – 2011-04-26 04:18:38
根据您的平台上,你有几个选择:
- 由于这是C++,你可以欺骗和调用的 STL allocators之一。我怀疑这是面试官想要的,但是谁肯定知道?
- 您总是可以使用固定大小的池作为几个答案建议。
sbrk
也是一种选择,但它的使用是不鼓励的,它不再是POSIX的 的一部分。- 你也可以(在 Windows或
VirtualAlloc
或CreateFileMapping
)使用mmap
作为存储源,但如果你想的内存块不是整个页面的小 你仍然需要编写一些代码来管理 存储这些功能返回。
你分配器应确保存储器正确地为您的平台一致: 在某些系统上,对齐的内存访问是无效操作上 人有一个性能命中与对齐访问。在实际中,生产 代码您也可能希望提供free
操作以避免在整个系统的内存和锁定上执行 以使堆保持线程安全。
...或共享内存。 – 2011-04-26 04:16:18
- 1. 用'new []'运算符分配内存
- 2. 如何在不分配内存的情况下测量.net应用程序的内存使用情况?
- 3. 如何在不分配内存的情况下构造对象?
- 4. void *在malloc与运算符new
- 5. 如何在不分配内存的情况下反转字符串
- 6. Malloc和新运算符分配内存有什么区别?
- 7. C++ new/new [],它如何分配内存?
- 8. 如何在不分配新内存的情况下删除部分数组?
- 9. 如何在不使用MUL或DIV运算符的情况下将两个数字在程序集中分开?
- 10. 使用new()运算符分配内存时,mudflap会抛出核心转储
- 11. 如何分析内存使用情况?
- 12. STL分配器和运算符new []
- 13. 如何在不使用“运算符”一词的情况下调用模板化的运算符重载?
- 14. 如何在不使用运算符的情况下编写LessThan方法
- 15. 如何在不使用免费()的情况下释放内存
- 16. 在没有malloc的情况下分配struct dirent()
- 17. 如何分配内存使用C++而不是C malloc
- 18. 在不分配内存的情况下将整数转换为字符串
- 19. 如何在使用Postgres SQL的情况下使用类似运算符?
- 20. 在没有malloc的情况下创建内存缓冲区
- 21. 如何计算malloc分配的内存块的结束地址?
- 22. 无法使用MALLOC分配内存
- 23. 使用malloc分配动态内存
- 24. 使用malloc动态分配内存()
- 25. 如何在不使用字符串或整数运算的情况下使用while循环来反转数字?
- 26. 使用new运算符,请
- 27. Go如何在make或new calls中分配内存?
- 28. 如何在C++中使用new动态地分配内存?
- 29. malloc分配内存和SIGSEGV
- 30. 如何在不使用strlen的情况下计算字符串的字符数
多么愚蠢的问题。我希望为你着想,你没有得到这份工作! – 2011-04-24 16:51:40
@David:或者朋友。 – 2011-04-24 17:07:54
对不起,这个问题让你们感到很蠢。不过,我得到了答案,并得到了改善。我认为它比无知更愚蠢。 – qwerty 2011-04-24 17:25:47