美文网首页真相系列
malloc分配的内存真的分配了吗

malloc分配的内存真的分配了吗

作者: 银角代王 | 来源:发表于2021-05-06 18:20 被阅读0次

你要的内存真的是你的吗

在linux上c或者c++常会用到堆内存分配函数malloc,malloc接受一个需要分配空间大小的参数,然后返回分配好的内存空间地址,通常会判断它的返回值是否为NULL,如果为NULL代表内存分配失败。但是有些情况下即使返回了非NULL,当向新的内存地址中写入数据时会遭遇失败(oom或者其他错误)。

原因是linux的copy on write(cow)策略,只有写入时才会真正分配内存。malloc返回的都是虚拟内存地址,当写入时才会分配物理内存。

linux会有一个零页。malloc时分配的内存指向零页。

内存预分配还管用吗

思考:一般分配内存后会立即使用(写入);当希望做一些空间预分配,减少后续多次分配带来的性能消耗时(类似自己管理内存),底层其实也没有真正为你分配内存,这不是很尴尬吗?当然可以通过分配后写入些什么(比如memset为0)来保证真正分配了物理内存。

参考以下文章和讨论:

https://stackoverflow.com/questions/911860/does-malloc-lazily-create-the-backing-pages-for-an-allocation-on-linux-and-othe

https://en.m.wikipedia.org/wiki/Copy-on-write

https://www.win.tue.nl/~aeb/linux/lk/lk-9.html

相关文章

  • malloc分配的内存真的分配了吗

    你要的内存真的是你的吗 在linux上c或者c++常会用到堆内存分配函数malloc,malloc接受一个需要分配...

  • malloc

    1:malloc分配内容和变量分配内存的区别 2:返回值

  • C语言内存处理

    1.动态存储分配 1.1.内存分配函数 在stdlib.h中声明(1)malloc():分配内存块,不初始化分配的...

  • malloc与calloc

    在gcc编译器中malloc与calloc它们都是实现内存分配。但是也有点小区别,就是malloc分配内存不会将数...

  • new and molloc

    申请内存所在的位置不同new在自由储存区分配内存空间,malloc从堆上动态分配内存. 返回类型不同new在分配内...

  • C语言-用指针实现内存动态分配

    动态存储分配函数 在C语言中,动态分配内存是通过动态存储分配函数 malloc() 来实现的,其功能是: 在内存的...

  • 08/09

    总结 动态存储分配 1、用到的函数: a、malloc 函数 : 1 分配内存快,内存快不初始化 2 函数...

  • 第11章:动态内存分配

    为什么使用动态内存分配 malloc和free calloc和realloc 使用动态分配的内存 常见的动态内存错...

  • C语言的malloc

    为什么C语言要有malloc malloc就是memory allocate动态分配内存,malloc的出现时为了...

  • Linux学习-内存管理篇(五)-内存分配函数

    一、kmalloc、vmalloc、malloc malloc: 负责分配用户空间内存。malloc是标准的C库函...

网友评论

    本文标题:malloc分配的内存真的分配了吗

    本文链接:https://www.haomeiwen.com/subject/pibddltx.html