C/C++知识点-内存分配相关
1、C语言malloc,calloc,realloc
这些个alloc是动态分配内存空间的常用函数。
相比让编译器分配静态的内存空间,动态分配内存空间是非常有必要的。如在嵌入式开发时,静态分配的空间必须有足够的空间,我申请了100字节,可能实际使用就只有80个,剩下的20个就浪费了。好处是无需程序员管理内存,内存的分配是在栈中进行。
动态分配内存时是使用内存的堆区,程序员知道要使用这么多空间,就分配这么多。相应的程序员需要自己回收空间,否则会发生内存泄漏。
如果是多维数组,分配空间时会由外层向内层分配,回收空间时,由内层向外层逐层回收。
1.1 malloc,函数原型 void *malloc(unsigned int num_bytes);
int *p = (int )malloc(10sizeof(int));//如果机器宽度为32位4字节的话,一般编译器结果sizeof(int) = 4。
1.2 calloc函数,原型void *calloc(size_t n, size_t size);
比malloc多一个参数,函数会自己算需要分配的内存大小,比如:
int *p = (int *)calloc(10, sizeof(int));
malloc 和 calloc多区别
malloc,分配的空间不会被初始化,值时随机的。省去了初始值的设置步骤,效率高一点。
calloc,分配的空间会被初始化为0,相应的效率会低一点。
1.3 realloc ,void realloc(void *ptr, size_t new_Size)
给现有内存扩充空间,ptr是基地址,new_Size是扩展的内存空间大小。
如果空间足够,返回的地址指针不会变,如果空间不够,返回的地址空间会变。
1.4 另外,sizeof运算符不能计算出动态分配的空间大小。动态分配的空间大小程序员自己要清楚。
sizeof时编译时就确定大小的。
和sizeof相对应的,strlen函数是一个字符串处理函数,它是只用于字符串计算长度。参数只能是字符指针,且是以'\0'结尾。
1.5 new,delete
1.5.1 new,delete是运算符,除了可以用此两个运算符分配空间,还会触发构造,析构。
delete如果是数组,数组中如果是对象,那么数组中的每个对象在回收空间时会触发分别单独的析构。
1.6 常量指针,指针常量
常量指针: 是一个指针,指向一个只读变量。
int const *p; 或者 const int *p;
指针常量:一个不能指向的常量。指针式个常量,不能中途改变指向。
如:int *const p;