常见面试题及答案汇总

1.堆栈溢出一般是由什么原因导致的?

答:1.没有回收垃圾资源

        2.层次太深的递归调用(无限递归调用),每一次函数调用都会将参数、返回值不停的压栈。

2.new、delete、malloc、free的关系

delete会调用对象的析构函数,和new对应。free只会释放内存。new会调用构造函数。malloc与free是C++/C语言的标准库函数,new和delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。

简而言之,malloc和free只会动态申请内存和释放内存,而new和delete除了动态申请示范内存外还会调用构造函数和析构函数。malloc和free是标准库函数,new和delete是运算符

malloc和free只能满足内部数据类型的对象的内存的动态分配和释放,而new和delete都可以。malloc和free申请和释放的动态内存在自由存储区,new和delete的在堆区。

3.delete和delete[]

C++中回收new分配的单个对象的内存空间的时候用delete,回收用new[]分配的一组对象的内存空间的时候用delete[]。关于new[]和delete[]又分为两种情况:(1)为基本数据类型分配和回收空间;(2)为自定义类型分配和回收空间。delete只会调用一次析构函数,而delete[]会动用每一个成员的析构函数。

基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。

4.什么时候使用常引用

为了提高程序的执行效率,通常将函数的参数声明为引用,这样当传递实参时,就不必再生成实参的副本,并未副本分配内存空间。在函数体内操作的就是实参的别名,即是实参本身,并且与指针相比,具有良好的可读性和可操作性;如果此时又有需求保证传进去的实参不被改变,就必须要把作为参数的引用声明为常引用。其实,为了区分是传出参数还是传入参数,都应该在不需要改变实参的情况下使用const。

拷贝构造函数的参数必须是常引用:Array(const Array & arr);

5.c和c++中的struct有什么区别

c中struct只是变量的集合体,不能包含成员函数,没有访问权限的概念

c++中的struct和c++中的一样,可以有成员变量也可以有成员函数,也有继承多态的特性,唯一的不同是class的默认访问权限是private,而struct的默认访问权限是public。

6.引用和指针的区别

(1)联系:引用和指针的功能类似,都是提供对其他对象的一种间接引用方式;都是地址的概念,指针指向一块内存地址,它的内容是所指内存的地址,引用是某块内存的别名

(2)区别:引用被创建时就必须被初始化,且不能有NULL引用,必须和合法的存储单元关联,而指针可以在任何时候被初始化,可以有NULL指针。

一旦引用被初始化,就不能改变引用的关系,而指针可以改变指向关系,被重新赋值,指向另一个对象。

使用时,引用无需解引用,指针需要解引用*

sizeof引用是得到的引用所指向的变量的大小,而sizeof指针得到的是指针本身的的大小

引用本身不能被const修饰,而指针可以,被const修饰的指针不能改变所指



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值