C/C++之内存函数管理使用

C/C++之内存函数管理使用

malloc()、free()、calloc()、realloc()函数在头文件stdlib.h中

malloc()函数

原型:
void *malloc(size_t size);

malloc()的参数是需要分配的内存字节数。
如果内存池中的可用内存可以满足这个需求,maollc就返回一个指向被分配的内存块起始位置的指针(指针类型为void *)。
如果,操作系统无法向malloc提供足够内存,malloc就返回一个NULL指针。因此每个从malloc返回的指针都要进行检查,确保它并非NULL。
例如:

#include <stdio.h>
#include <stdlib.h>
int main(){
    int *p;
    //表示如果malloc成功从内存获取100个字节的连续空间,并将内存空间起始地址给p;否则将返回NULL并赋值给p;
    if((p = (int *)malloc(100)) == NULL){
        printf("out of memory !");
        exit(1);
    }else{
        printf("malloc(100) success!");
    }
}
/****输出****
malloc(100) success!
************/

calloc()函数

原型:
void *calloc( size_t num_elements, size_t element_size);

calloc也用于分配内存。calloc的参数包括所需元素的数量和每个元素的字节数。除参数设置于malloc不同外,calloc在分配内存时会自动将存储空间置初值0;
例如:

#include <stdio.h>
#include <stdlib.h>
int main(){
    int *p;
    //表示如果calloc成功从内存获取4*10个字节的连续空间并值初值0,则将起始地址给p;否则将返回NULL并赋值给p;
    if((p = (int *)calloc(4, 10)) == NULL)
    {
        printf("out of memory !");
        exit(1);
    }else{
        printf("calloc(4, 10) success !");
    }
}
/****输出****
calloc(4, 10) success !
************/

realloc()函数

原型:
void * realloc( void *ptr,size_t new_size)

realloc()函数用于修改一个原先已经分配的内存的大小。第一个参数为需要改变内存大小的指针名,第二个参数为新分配内存的大小。
使用这个函数,你可以使一块内存扩大或缩小。
如果它用于扩大一个内存块,那么这块内存原先的内容依然保留,新增的内存添加大原先内存块的后面。
如果用于缩小一个内存块,该内存尾部的部分内存便被拿掉,剩余部分内存的原先内容依然保留。
如果原先的内存块无法改变大小,realloc()将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上。
因此,在使用realloc之后,就不能再使用旧内存的指针,而是应该使用realloc()所返回的新指针。 realloc()失败的时候,返回NULL。若realloc的一个参数为NULL,那么他的行为就和malloc一样。若第二个参数为0,则效果等同于free()。

free()函数

原型:
void free(void *ptr)

free函数用于释放内存。参数表示malloc()、calloc()、realloc()返回的地址。若参数等于NULL,则free不会产生任何效果。free函数无返回值。

new操作符

C++中动态内存创建new分为两个步骤:

  • 在堆里为对象分配内存;
  • 如果内存分配成功,则为该内存调用合适的构造函数进行初始化;

new 实际上总以标准C中的malloc()完成。

例如:

int *q = new int;
//申请内存存入数值888
int *r = new int(888);

delete操作符

delete operator也相应地分为两步:

  • 调用相应类的析构函数;
  • 释放内存。

    delete operator也是以标准C中的free()完成。

    例如:

    int *r = new int(888);
    delete r;

使用原则:
- 不要用delete来释放不是new分配的内存。
- 不要使用delete来释放同一内存两次。
- 如果在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果在new[]表达式中不使用[],一定不要在相应的delete表达式中使用[]。

猜你喜欢

转载自blog.csdn.net/walkerkalr/article/details/81149148