今天突然在linux下试了下malloc,以下是我的代码 |
|
10分 |
linux malloc函数的底层是brk,sbrk系统调用现的, windows是其他的系统调用、
linux下的malloc函数在该进程第一次申请内存的时候实际会像内存请求33页的大小(1页=4096字节), 之后程序中再用到malloc的时候就可以直接在这33页中分配, 而不需要系统调用, 减少内核到用户态的切换, 提高效率。 windos也会有这样的一些底层维护, 只是不开源的话无从细说。 关于分配33页是ubuntu系统下的验证结果。 |
5分 |
你malloc分配了多少内存就用多少内存,越界肯定是错误的,至于错误的具体表现就跟C库的实现有关,各个C库会保证正确使用库函数的行为一致,但并不保证错误行为也一致。
那个free的错误是因为你越界多写了一个字节导致内存管理列表乱了造成的。 |
5分 |
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
|
Linux是开源的。
|