C++编程基础(1)-C中的malloc/free和C++中的new/delete

来源:互联网 发布:哭声 知乎 编辑:程序博客网 时间:2024/05/18 02:44

1.在C的代码中,经常用到malloc在堆上开辟内存,然后用free释放内存(后面会说释放后,最好加上NULL)。而在C++中的开辟内存和释放内存用的是new/delete.
下面就来说说这两者区别:

  1. 有了malloc/free为什么还要有new/delete
    要知道,malloc/free是C/C++语言标准库中的标准库函数,而new/delete是C++语言中的运算符。
    有这样一句话:虽然两者都能起到申请内存和释放内存的作用,但是对于非内部数据类型的对象而言,光是用malloc和free是无法满足要求的。

    理解:因为C++是面向对象编程,于是会产生很多自己编写的类,产生对象,这些类不是C、C++内部的数据类型,是自己定义的数据类型,这些类在产生对象的时候,会自动执行构造函数,在对象消亡的时候,会自动执行析构函数,而malloc/free是库函数,不是运算符,不在编译器的自动运行权限之内,所以malloc/free不能强行去执行构造函数和析构函数。所以C++定义了一个能完成动态内存分配和初始化构造函数工作的运算符new,还有一个用于释放内存的运算符delete。

  2. 为什么不直接全用new/delete算了
    从上面可以看出,new/delete的功能似乎要强大一点,但是C语言是无法使用运算符new/delete的,在编译C语言语法的时候,就还是需要使用malloc/free.

2.堆上动态分配内存会有内存耗尽的情况

当在动态申请内存找不到足够大的内存空间的时候,malloc和new会返回一个NULL指针,来宣告内存申请失败。
在代码中通常这么处理:

void Func(){    A *a=new A();    if(a==NULL)    {        exit(1);//终止代码    }}

3.malloc的使用要点
mallow函数的原型为 void* malloc (size_t size)

用malloc动态申请一块长度为length的整数类型的内存的语法为

int* p=(int*)malloc(sizeof(int) * length)

重点是类型转换(int*)和sizeof