zl程序教程

您现在的位置是:首页 >  其它

当前栏目

malloc, calloc and new

and New malloc
2023-09-14 09:15:01 时间

1. malloc vs calloc

        void *malloc(size_t size);

        void *calloc(size_t num, size_t size);

        函数malloc()calloc()都可以用来动态分配内存空间,但两者稍有区别。

        1. 参数指定方式不同

    malloc()函数由参数size指定总的要分配的内存空间的大小,字节单位
    calloc()函数通过两个参数num和size来指定,总分配内存空间大小=num*size,字节单位
    如果调用成功,函数malloc()和函数calloc()都将返回所分配的内存空间的首地址

        2. 所分配空间的初始化

    malloc()不对所分配的内存空间进行初始化,因为是从heap中分配空间,分配之前如果该片空间已经被使用过,其值会保存下来。所以malloc()分配后不能直接使用,为了保险起见应该先做初始化处理。如果在malloc()后没有适当的初始化的话,在程序开始运行时(内存空间还没有被分配使用过因而保持着0初始化的状态)能正常进行,但经过一段时间(内存空间已经被分配使用过,因而其中可能已经不是全0状态)后就可能会出现问题。
    calloc()会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那麽这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那麽这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零。 
    所以,可以不太严谨地说,calloc = malloc + memset
    两者都返回void*类型,在C,C++中,void* 类型可以强制转换为任何其它类型的指针。因为调用malloc或者calloc都需要将返回的指针强制转换为所需要的类型。

2. new()

 
New()是C++中的导入的内存分配函数。它有以下几种典型的调用方法。
为指定类型的分配存储一个数据的空间,并初始化为0.

        pointer_variable = new datatype;

为指定类型分配存储一个数据的空间,并初始化为value所指定的值。

        pointer_variable = new datatype(value);

为指定类型分配存储多个数据的空间。需要注意的是,指定初始值是用(),而指定个数

        pointer_variable = new datatype[num];

与malloc()不同的是,new()会根据所指定的数据类型自动计算所需要的空间大小,这个与calloc()有点类似。
与malloc()和calloc()不同的是,new()返回的指针类型为所指定的指针类型,不需要再进行类型强制转换。
与calloc()相似,new()在缺省的调用中会将所分配的内存初始化为0。但是new()比calloc()更强大的地方在于它还可以指定任意的初始化值。
此外,Malloc()和calloc()所分配的内存都是用free()进行释放,而new()则于delete()配对使用。