1. malloc/free是函数,而new/delete是关键字。
2. malloc成功后返回void *指针,需要强转,失败则返回NULL。new成功后返回指向对象的指针,失败抛出异常。虽然C++尽最大的可能去兼容C语言的特性,new失败也会返回NULL,但很少使用。
3. malloc申请空间时要指明申请空间的大小,而new只需要对象名就可以了。
4. malloc是从堆上开辟内存,而new是从自由存储区开辟内存(是C++抽象出来的概念,不仅是堆上的存储空间,还可能是静态存储区)。
5. malloc不仅可以申请单个对象还可以为数组申请空间,都用free()释放。而new要用new[size] delete [size]进行申请和释放对象空间。(虽然内置类型不影响,但是释放自定义类型时,可以将对象的个数写入size位置。
6. malloc申请的内存不够时,可以用realloc解决。而new没有直接的办法解决。但是它会触发new_handler机制,查看用户有没有设置set_new_handler句柄,该句柄的作用是如果设置,尝试从操作系统申请内存,如果实在申请不到就抛出bad_alloc异常。
7. new和delete还会调用构造和析构函数。
指针和引用的区别
1. 指针占用具体的空间,但是引用只是变量的别名
2. 在32位系统下,sizeof指针是4个字节,sizeof引用则是它所指向的具体的对象的大小。
3. 有多级指针,但是只有一级引用。
4. 指针可以被初始化为NULL,但是引用必须要初始化为已存在得对象的引用。(引用在三种情况下,可以不需要初始化
1. 引用作为形式参数时,由调用者传来的实参进行初始化
2. 引用作为外部变量时,可以在任何地方进行初始化
3. 作为类的数据成员时,由类的构造函数进行初始化)
5. 指针作为参数时要操作它指向的参数要进行解引用,而引用则直接进行修改它所引用的变量。
6. 指针的指向可以改变,而引用变量只能引用一个变量。
7. 指针++和引用++的意义是不一样的。
编译器不允许把一个结构体强转为任何其他类型。