阿里电话面-c++开发(2019.4.27)

一:阿里电话面-c++开发(2019.4.27)

c++:

1.虚函数、进程与虚拟地址(操作系统里面的)?

在基类的函数前面加上virtual关键字,使用虚方法可以实现类的动态绑定,即根据对象运行时的类型确定调用哪个类的方法,而不是根据对象定义时的类型确定调用哪个类的方法。实现了函数的多态。

进程与虚拟地址:不懂,后来百度的。

32位系统下每个进程都会分配4G的虚拟内存空间,而其实所有进程都共享着同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。每次访问内存空间的某个地址,都需要把地址翻译为实际物理内存地址。这时我们需要一个东西它就是MMU(内存管理单元),它的主要作用就是完成地址的映射,也就是页表的建立、映射过程。页表是记录进程中哪些虚拟内存上的数据在物理内存上以及它们在物理内存上的位置。每个进程都有一个页表,当进程需要访问某个虚拟地址时,就会去访问页表,页表实现从页号到物理块号的地址映射。

存储在硬盘上的可执行程序被操作系统装载为进程,放入虚拟内存空间。当需要访问物理内存的某个地址时,再通过MMU实现虚拟内存对物理地址的映射,达到访问物理地址的目的。

(参考https://blog.csdn.net/MBuger/article/details/70159975

2.vector与list区别?一直往vector类型的变量中添加数据会溢出吗?

vector是动态数组,list是双端链表。

当一个vector预分配的存储空间用完之后,为维护其连续的对象数组,它必须在另外一个地方重新分配大块新的(更大的)存储空间,并把以前已有的对象拷贝到新的存储空间中去。所以不会溢出。

3.集合(set)和映射(map)的区别?查找元素时各自的时间复杂度?

set的元素不像map那样可以同时拥有键值(key)和实值(value),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。multiset允许有相同的键值。集合(set)和映射(map)都有基于红黑树(red-black tree)和散列表(hashmap),基于红黑树的元素可以自动排序,基于散列表的元素不能自动排序。

无论集合(set)还是映射(map),基于红黑树(red-black tree)查找元素的时间复杂度是O(Log(N)),因为红黑树是二叉平衡树,查找时间复杂度是O(Log(N));基于散列表(hashmap)查找元素的时间复杂度是O(1),因为散列表查找时间复杂度是O(1)。

4.解释什么是内存泄漏和防止内存泄漏的方法?

内存泄漏:程序在申请内存时,无法释放已申请的内存,一次内存泄漏可以忽略;但内存泄漏堆积后果很严重,无论多少内存,都会用光。

防止内存泄漏的方法:

内存泄露的问题其困难在于1.编译器不能发现这些问题。2.运行时才能捕获到这些错误,这些错误没有明显的症状,时隐时现。3.对于手机等终端开发用户来说,尤为困难。下面从两个方面来解决内存泄露:

第一,良好的编码习惯,尽量在涉及内存的程序段,检测出内存泄露。当程式稳定之后,在来检测内存泄露时,无疑增加了排除的困难和复杂度。使用了内存分配的函数,要记得要使用其想用的函数释放掉,一旦使用完毕。

第二,重载  new 和 delete。这也是大家编码过程中常常使用的方法。

补充问题:

4.1  由内存泄露引出内存溢出话题:

所谓内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是会产生内存溢出的问题。

常见的溢出主要有:

(1)内存分配未成功,却使用了它。
常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p 是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc 或new 来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。

(2)内存分配虽然成功,但是尚未初始化就引用它。
(3)内存分配成功并且已经初始化,但操作越过了内存的边界。
例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for 循环语句中,循环次数很容易搞错,导致数组操作越界。又如申请了一个int型的内存变量,但给它存long才会存下的数,就会内存溢出。

使用free 或delete 释放了内存后,没有将指针设置为NULL。导致产生“野指针”。

程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。(这点可是深有感受,呵呵)


不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

参考 https://blog.csdn.net/na_he/article/details/7429171

5.智能指针?

面试时完全没听说,后来百度。

https://www.cnblogs.com/wxquare/p/4759020.html

https://blog.csdn.net/worldwindjp/article/details/18843087#comments

网络:

6.TCP协议和四次挥手?

7.解释拥塞控制过程?

(6和7说下过程就好)

操作系统:

8.socket进程间通信?

ip地址:端口号

 

答案不一定对,还望博友指导更改!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值