new和delete
堆区内存的分配与释放,在c语言中使用 malloc/free,在c++中使用new/delete
//只分配内存不初始化int *p = new int;//分配内存并初始化int *p = new int[10];//释放内存delete p;
开辟多个内存/释放
int *p = new int[3]{1,2,3};delete[3];
面试常问问题:
1 有了malloc/free为什么还要new/delete?
malloc和free是C++/C语言的标准库函数,new/delete是C++的运算符,它们都可以用于动态内存和释放内存
对于非内部数据类型的对象而言,光用malloc和free无法满足动态对象的要求,对象在创建时要自动执行构造函数,在消亡之前要自动执行析构函数(内部数据是编译器本身就有的,不需要用户定义如int,非内部数据类型是用户自己定义的,如class,struct)
由于malloc/free是库函数而不是运算符,不在编译器的控制权限之内,不能把执行构造和析构函数的任务强加给malloc/free,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete
2.为什么不淘汰malloc/free
因为c++程序经常要调用c函数,而c程序只能用malloc/free管理动态内存
3。malloc/free和new/delete的区别
都是动态管理内存的入口
malloc/free是c/c++标准库的函数,而new/delete是c++运算符
malloc/free只能分配与释放内存,new/delete还可以调用构造函数进行初始化,析构函数进行资源释放
前者需手动计算内存大小且返回值为void,后者可自己计算类型大小,返回对应类型的指针
后者的底层逻辑调用了前者
new直接跟类型,malloc跟字节个数
链接库
在C++中链接C语言函数库
#ifndef __headfile__
#define __headfile__#include <stdio.h>#ifdef __cplusplusextern "C"
{
#endif extern int add();extern int sub();#ifdef __cplusplus
}
#endif#endif
加上extern"C" 声明后,会告诉C++这些函数接口时C语言的函数接口,在编译时按照C语言的规则调用,而不是C++的函数名+参数类型的方式调用
面向对象与面向过程
面向过程是分析解决问题的方法然后一步步去做
面向对象是分析出解决问题需要哪些对象参与,然后把这些对象创建出来,让这些对象去解决问题
面向过程优缺点:设计简单,但难以维护,难以更改程序
面向对象优缺点:设计复杂,性能略微降低,但易维护易扩展复用,每个对象相互独立