1.C++有了malloc和free为什么还要new和delete?
第一:malloc和free属于c++的标准库函数,new和delete属于c++的运算符,他们都用于申请动态内存和释放内存。第二:对于非内部的数据对象(比如类对象),只用malloc和free无法满足动态对象的要求。这是因为对象在创建的同时需要自动执行构造函数,而在销毁对象前需要自动执行析构函数,而malloc和free属于库函数不是运算符,不在编译器控制范围内,所以不能自动执行构造函数和析构函数。
为什么库函数不在编译器控制范围内,而运算符在?
库函数是已经编译的代码,编译器不会再检查编译,由链接器将库通用户写好的代码合成exe文件。而运算符是否正确,编译器在编译扫描分析时就可以判定。
参考:https://blog.youkuaiyun.com/leikun153/article/details/80612130
https://www.cnblogs.com/Y1Focus/p/6707121.html
2.delete和delete[]的区别
delete只会调用一次析构函数,delete[]会调用每一个成员的析构函数。内部数据没有析构函数,所以即使改用delete时用了delete[]问题也不大。
3.子类析构时需要调用父类的析构函数吗?
析构函数的调用顺序是先子类析构,后父类析构。就是说在调用父类的析构函数时子类的信息已经全部销毁了。
4.C++不是类型安全的,两个不同类型的指针可以强制类型转换(用reinterpret_cast)
5.main函数执行之前还会执行什么代码?
全局对象的构造函数会在main函数之前执行
6.全局变量和局部变量有什么区别?如何实现,编译器和操作系统怎么知道的?
生命周期不同:全局变量随程序创建而创建,局部变量在局部函数内部或者局部循环体内存在,退出就不存在了。
适用方式不通:通过声明后全局变量可以程序的各个部分用到,局部变量只能在局部适用,分配在栈区
操作系统和编译器通过内存分配的位置来判断,全局变量分配在全局数据区,局部变量分配在堆栈区
7.C++内存有几种类型? 5个区
栈:由编译器在需要的时候分配,不需要的时候清除的变量所在的存储区,通常是局部变量和函数参数
堆:new分配的内存区域,释放编译器不管
自由存储区:malloc分配的内存区域,由free结束生命
全局/静态存储区
常量存储区:里面存储的是常量,不允许修改
参考:https://blog.youkuaiyun.com/qq_34037046/article/details/77714832
8.c++的构造函数为什么不能是虚函数,而基类的析构函数必须是虚函数?
vptr指针指向虚函数表,执行虚函数的时候,会调用vptr指针指向的虚函数的地址。当定义一个对象的时候,首先会分配对象内存空间,然后调用构造函数来初始化对象。vptr变量是在构造函数中进行初始化的。又因为执行虚函数需要通过vptr指针来调用。如果可以定义构造函数为虚函数,那么就会陷入先有鸡还是先有蛋的循环讨论中。
基类指针指向了派生类对象,而基类中的析构函数是非virtual的,而虚构函数是动态绑定的基础。现在析构函数不是virtual的,因此不会发生动态绑定,而是静态绑定,指针的静态类型为基类指针,因此在delete的时候只会调用基类的析构函数,而不会调用派生类的析构函数。这样,在派生类中申请的资源就不会得到释放,就会造成内存泄漏,这是相当危险的:如果系统中有大量的派生类对象被这样创建和销毁,就会有内存不断的泄漏,久而久之,系统就会因为缺少内存而崩溃。
参考:https://blog.youkuaiyun.com/gochenguowei/article/details/79682681
9.c++多态
参考:https://www.cnblogs.com/cxq0017/p/6074247.html
10.c++中public,protected,private的区别
第一:protected和private的区别在于 ,protected的访问标号限制,能够被派生类的成员函数访问,而private不能
第二:protected和public的区别在于,protected的访问限制,使其不能被基类的对象访问。