找工作汇总题(每日更新)

一、static关键字的作用
a)修饰局部变量,放在全局区。并且不会函数的终止而丢失。
b)修饰函数,作用在该.cpp文件中,不与其他的文件的同名函数相冲突。
c)修饰类的成员变量。在类内申明 在类外定义。并且该变量不属于某一个对象,整个类共享。
d)修饰类的成员函数。只能访问静态成员变量 和全局变量。

二、内存4区
a)代码区:存放函数体的二进制代码,由操作系统进行管理。
b)全局区:存放全局变量和静态成员变量,常量区和字符串常量也放在这。
注:关于const修饰的全局变量放在全局区,修饰的局部变量不在全局区。
c)栈区:由编译器自动释放,存放函数的参数值和局部变量。栈区开辟的数据由编译器自动释放。
d)堆区:由程序员手动开辟和释放 通过关键字new。

三、malloc/free 和new/delete的区别
1)malloc/free 是标准库函数要有头文件<malloc.h>,而new/delete是操作符可以重载。
2)malloc返回的void*数据类型,因此需要通过强转换符,而new 是返回某种数据类型。
3)malloc要指定申请内存的大小,new 不必指定申请内存的大小。
4)new/delete在申请非内部数据类型的对象时 ,会在创建的同时自动执行构造函数,在消亡会自动执行析构函数,这不在编译器的控制之内。malloc/free 无法实现

四、内存溢出和内存泄漏
a)溢出是指程序在申请内存时,没有足够的空间供其使用
b)泄露是指程序在申请内存后没无法释放已申请的内存空间

五、TCP拥塞控制的方法
为了防止拥塞窗口cwnd增长过大引起网络拥塞,需要设置一个慢开始门限状态变化量(ssthresh)
当cwnd<ssthresh时,使用慢开始算法
当cwnd>ssthresh时,使用拥塞避免算法
当cwnd=ssthresh时,二者皆可。
a)慢开始:.由小到大逐渐增大拥塞窗口的数值,加倍的方式增长。
b)拥塞避免:让拥塞窗口缓慢的增加,线性规律缓慢增长。
c)快重传:要求接收方每收到一个失序的报文段就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),然后若是发送方接收到3个重复确认ACK,则启动快重传算法。
d)快恢复:拥塞窗口减半cwnd =cwd/2.ssthresh = cwnd;

一张图表示:
在这里插入图片描述

六、TCP的三次握手
1)第一次握手 :客户端向服务器发出连接请求报文。SYN=1,同时初始序列号seq =x。
2)服务器收到请求报文后,如果同意链接,则发出确认报文,ACK=1
SYN=1,确认号是 ack=x+1。同时也为自己初始化一个序列号seq =y 。
3)客户端收到确认后,还要向服务器给出确认。确认报文的ACK=1.ack=y+1,自己的序列号seq = x+1。
在这里插入图片描述

七、为什么是三次握手而不是两次握手

  • 主要防止已经失效的连接请求报文突然又传到了服务器,从而产生错误。*
    如果只有两次连接,假设这样的场景:客户端发送了一个请求连接并且没有丢失,只是因为在网络节点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文。此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将客户端和服务器在此建立连接,这将导致不必要的错误和资源的浪费。如果是三次握手,就算失效的报文传过来,服务器接收到那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

八、四次挥手
1)客户端发送连接释放报文,并且停止发送数据,FIN=1,序列号seq =u
2)服务器收到连接释放报文,发送确认报文,ACK=1 ack =u+1,并且带上自己的序列号 seq =v
3)服务器将最后的数据发送完毕后,就像客户端发送连接释放报文,FIN=1,ack=u+1,序列号seq =w.
4)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq =u+1.
5)服务器收到客户端发出的确认,结束。
在这里插入图片描述

九、unordered_map和map的区别
1)unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是
unordered_map不会根据key的大小进行排序,是无序的。
2)unordered_map的底层实现是哈希表,因此查找的时间复杂度为O(1),而map的底层实现是红黑树,时间复杂度为O(log n)。

十、红黑树
1)节点不是红就是黑。
2)根节点一定是黑色。
3)红节点的两个子节点都是黑色。
4)叶子节点均是黑色。
5)所有节点到叶子节点的黑高都相同。

十一、C++中的4个智能指针
总共有4中智能指针: auto_ptr,uniqe_ptr,share_ptr,weak_ptr。
为什么要使用智能指针:申请的空间在函数结束时,忘记了释放,造成内存的溢出。智能指针能有效的解决这一问题。智能指针是一个类,会自动调用析构函数
析构函数会自动释放资源。

1:auto_ptr
不能把两个auto_ptr对象拥有同一个内部指针的所有权,这样二者都会尝试析构这个内部指针;
int *a = new int(3)
auoto_ptra1(a);
auoto_ptra2(a);
当两个auto_ptr对象之间发生赋值时,内部指针所拥有的所有权会被转移,这意味这这个赋值的右值对象会丧失所有权,变为空
auoto_ptra1(new int (2));
auoto_ptra2(new int (3));
a2=a1;

2:unique_ptr
实现独占式拥有严格拥有概念,保证同一时间内只有一个智能智能指向该类对象

3:shared_ptr
实现共享式拥有感念。多个智能指针可以指向相同对象。它使用计数机制来表明资源被几个指针共享。当最后一个引用会销毁时会释放资源。

4:weak_ptr
为了用来解决 shared_ptr相互引用时的死锁问题。这两个指针的引用计数永远不可能降为0,资源不会释放。它是对象的一种弱引用,不会增加引用对象的引用计数。

十二、虚函数和多态
虚函数的实现:在有虚函数的类中,类的最开始部分是有一个虚函数表的的指针,这个指针指向一个虚函数表,表中存放了虚函数的地址,实际的虚函数存放在代码段, 当子类继承了父类的时候也会继承其虚函数表。当子类重写父类中虚函数时候,会将继承到的虚函数表中的地址替换成为重新写的函数地址。
类的大小为:1 有虚函数的为:4

纯虚函数和抽象类。
当类中有了纯虚函数,这个类也称为抽象类
抽象类 无法实例化对象。子类必须重写抽象类中的纯虚函数,否则也属于抽象类

多态
1)静态多态:函数重载和运算符重载
2)动态多态:派生类和虚函数实现运行时多态

二者的区别
静态多态的函数地址早绑定,编译阶段确定函数的地址
动态多态的函数地址晚绑定,在运行时确定函数的地址

动态多态发生的使用:基类的指针或引用指向派生类的对象
动态多态发生的条件:有继承关系,派生类要对基类的虚函数进行重写

虚析构和纯虚析构
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码
解决方式:将父类中的析构函数改为虚析构。

十三、socket编程中服务器端和客户端主要用到哪些函数
服务器端:
1)服务端创建一个socket,使用socket函数
2)通过blind()函数,将IP和端口号绑定
3)置于listen()状态,最大连接数
4)接受客户端的连接,使用accept()函数
5)收发数据 send()/rec()
6)关闭连接

客户端:
1)创建一个socket,用socket()函数
2)设置要连接的对方的IP地址和端口号属性
3)连接服务器,用函数connect()
4)收发数据,用函数send()和recv(),或read()和write()
5)关闭网络连接
在这里插入图片描述

十四、memcpy函数的实现(内存重叠的方法)
1)strcpy实现的是字符串的拷贝,不需要设置拷贝内容的大小 碰到’\0’自动退出。
2)memcpy实现的是内存的拷贝,都可以拷贝

void* memcpy1(void *dst, void *src, int n)
{
 if (dst == NULL || src == NULL || n < 0)
 {
  return NULL;
 }
 char *pdst = (char*)dst;
 char *psrc = (char*)src;
 if (pdst > psrc || pdst < psrc + n)
 {
  pdst = pdst + n - 1;
  psrc = psrc + n - 1;
  while (n--) {
  *pdst-- = *psrc--;
   }
 }
else{
  while (n--)
  {
   *pdst++ = *psrc ++ ;
  }
}
 return dst;
}

int main() 
{
 string s = "abc";

 char str[] = { "abcdefgh" };
 memcpy1(str + 2, str, 5);
 cout << str;

对于内存重叠主要判断 : d>s 或者d <s+n都会出现内存重叠问题。

十五、

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值