c++基础知识(4)

来源:互联网 发布:淘宝代做课程设计 编辑:程序博客网 时间:2024/06/06 07:16

在c++当中,常常会使用动态内存,其中经常使用的是malloc,calloc,realloc。

使用_msize()函数可以获得指针指向的内存空间大小,例如int p=(int )malloc(4*sizeof(int));cout<<_msize(p);

malloc的使用方法int p=(int )malloc(4*sizeof(int));malloc函数的参数是想要开辟的空间大小,函数的返回值是void *,所以在实际使用当中往往会对函数的返回值进行类型转换,得到自己想要的指针类型。当没能成功开辟空间的时候,函数的返回值是NULL,因此在实际使用当中malloc结束后,往往会对返回值进行检验,防止对空指针进行操作。 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

calloc的使用方法是int p1 = (int )calloc(sizeof(int),10);calloc函数与malloc函数相似,都是用于新开辟内存空间,参数有两个,一个是申请地址的单位元素长度,另一个是申请的元素的个数。Calloc与malloc的另外一个不同之处在于malloc不能初始化开辟的内存空间,而calloc会将所分配的内存空间中的每一位初始化为零,也就是说,如果是为字符类型或者整型数据类型分配内存,那么这些元素将保证被初始化为零;如果是为指针类型元素分配内存,那么这些元素通常会被初始化为空指针;如果是为实型数据分配内存,那么这些元素将被初始化为浮点类型的零。

realloc的使用方法是int p = (int )malloc(10 * sizeof(int)); p = (int )realloc(p, 100 sizeof(int));realloc是从堆上分配内存的。当用户试图扩大一块内存空间的时候,realloc会从堆上现存的数据后面的空间进行空间的扩大。如果有足够的空间给用户扩大,那么自然可以成功扩展空间;如果空间不够,那么会用堆上选择第一个足够大的空间分配给用户,并将原有的数据拷贝至新的内存空间,并将原来的数据空间释放。也就是说,在realloc的执行过程中有可能会产生数据移动。如果用户试图使用realloc缩小空间,那么被缩小的部分的数据自然会丢失。

#include<iostream>#include<cstdlib>using namespace std;int main(){    int *p = (int *)malloc(10 * sizeof(int));//p指向一个大小为10个int的内存空间    if (p==NULL){ cout << "error"; return 0; }    cout << _msize(p) << endl;//_msize(p)返回指针p指向的内存空间大小    cout << p << endl;    p=(int *)realloc(p, 2*sizeof(int));//给p重新分配空间为2个int大小    cout << _msize(p) << endl;    cout << p << endl;    p = (int *)realloc(p, 100 * sizeof(int));//给p重新分配空间为100个int大小    cout << _msize(p) << endl;    cout << p << endl;    //cout << *p << endl;    free(p);//释放p    int *p1 = (int *)calloc(sizeof(int),10);//给p1分配10个int大小的内存,初始化为0    *(p1 + 2) = 1;    cout << *p1 << endl;    p1++;    cout << *p1 << endl;    p1++;    cout << *p1 << endl;    p1++;    cout << *p1 << endl;    return 0;}

输出结果

400083D5C08 0083D5C0400008411800010