• 7.8 存储器分配


    7.8 器分配

    ANSI C明了三用于存间动态分配的函

    (1) malloc。分配指定字节数的存储区。此存储区中的初始值不确定

    (2) calloc指定度的象,分配能容其指定个数的存中的每一位( b i t )都初始化0

    (3) realloc。更改以前分配(增加或)增加,可能需以前分配容移到另一大的域,以便在尾端提供增加的存储区,而新增的初始值不确定

    #include <stdlib.h>

    void *malloc(size_t size) ;

    void *calloc(size_t n o b j, size_t size) ;

    void *realloc(void *ptr, size_t newsize) ;

    //三个函数返回:若成功则为非空指针,若出错则为NULL

    void free(void *ptr)

    分配函所返回的指一定是当对齐的,使其可用于任何象。例如,在一定的系上,如果最苛刻的对齐要求是double则对齐8的倍的地址,那么返回的指应这样对齐

    为这a l l o c都返回通用指针void *所以如果在程序中包括了< s t d l i b . h > (包含了函原型),那么们将这些函返回的指针赋与一不同型的指针时,不需要作转换

    freeptr指向的存。被放的空通常被送入可用存储区池,以后可在分配函数时再分配。

    realloc使我可以增、以前分配(最常的用法是增加该区)。例如,如果先分配一可容纳长5 1 2数组的空,并在填充它,但又发现realloc如果在储区后有足的空可供可在原存储区位置上向高地址方向充,并返回它的同的指值。如果在原存储区有足的空realloc分配另一大的存储区将现存的5 1 2元素数组容复制到新分配的存储区为这种存储区可能位置,所以不应当使用任何指指在该区习题4 . 1 8示了在getcwd中如何使用realloc,以理任何度的路名。程序17-28是使用realloc的另一例子,用其可以避免使用编译时固定度的数组

    注意,realloc的最后一个参数是存储区newsize(),不是新、旧长度之差。作特例,ptr是一空指realloc的功能与malloc相同,用于分配一指定newsize的存储区

    此功能是由ANSI C新引的。如果送一NULLrealloc的早期版本。早期版本允realloc自上次malloc, reallocc a l l o c放的种技巧可回溯到V 7,它利用malloc实现紧缩的搜索策略。4 . 3 + BSD仍支持功能,而SVR4不支持。种功能不再使用。

    些分配例程通常通s b r k ( 2 )统调实现统调()程的堆(见图7 - 3 )mallocfree的一个样实现请见K e r n i g h a nRitchie [1988] 8 . 7

    s b r k可以充或小一个进程的存,但是大多mallocfree实现都不程的存放的空可供以后再分配,但保持在malloc池中而不返回给内

    应当注意的是,大多数实现所分配的存比所要求的要稍大一些,外的空来记录管理信息——分配度,指向下一分配的指等等。就意味如果写过已分的尾端,则会后一的管理信息。型的错误灾难性的,但是因为这错误很快就暴露出,所以也就很难发现指向分配的指向后移也可能的管理信息。

    在动态分配的缓冲区前或后进行写操作,破坏的可能不仅仅是该区的管理记录信息,在动态分配的缓冲区前后的存储区很可能用于其他动态分配的对象。这些对象与破坏他们的代码可能无关,这造成寻求信息破坏的源头更加困难。

    其他可能生的致命性的错误是:放一经释放了的free所用的指不是

    a l l o c的返回值等。如若一个进程调用malloc函数,但却忘记调用free函数,那么该进程占用的存储器就会连续增加,这被称为泄露leakage。不调用free函数以释放不使用的空间,那么进程地址空间长度就会慢慢增加,直至不再有空闲空间,此时,由于过度的分页开销,因而使得性能下降。

    器分配出,所以某些系提供了些函的另一种实现方法。每次分配函中的任意一free行附加的出错检验。在编辑程序指定个专在程序中就可使用种版本的函。此外有公共可用的源(例如由4 . 3 + BSD所提供的),在编译时使用一特殊志就使附加的时间检查生效。

    分配程序的操作某些用程序的时间性能非常重要,所以某些系供了附加能力。例如, SVR4提供了名m a l l o p t的函,它使程可以置一些量,并用它们来控制存分配程序的操作。可使用另一m a l l i n f o的函,以分配程序的操作统计查看所使用系malloc ( 3 )册页,弄清楚些功能是否可用。

    可以替代存储器分配程序的函数和库。

    1.    libmalloc

    2.    vmalloc

    3.    快速分配quick-fit

    4.    alloca函数。

    可以查查相关的信息。

  • 相关阅读:
    selenium基础(鼠标和键盘事件)
    Java:面向对象三大特征
    Java:面向对象(上)
    Java:数组
    Java:方法
    Java基础:程序结构控制
    Java基础:用户交互Scanner
    Java基础语法(下)
    Jenkins(Extended E-mail Notification)邮箱配置正确但是并没有发送邮件
    接口自动化测试与Jenkins集成(Freestyle project任务版)
  • 原文地址:https://www.cnblogs.com/shaoguangleo/p/2806008.html
Copyright © 2020-2023  润新知