昨天辛辛苦苦写了一堆。。居然都没有了。好不容易写好的东西,点了发布居然在博客列表里找不到。这里重新简单整理一下题目:
1.c++基础
1. 当你使用new之后,发生了什么?
问题不难,和面试官沟通之后,发现他还想问当创建一个空类,除了有默认构造函数还会有什么默认成员函数。
总共有六个:(前四个是通常都知道的)
1. 默认构造函数
2. 默认析构函数
3. 默认赋值运算符
4. 取址运算符
5. 取址运算符 const
2.深拷贝和浅拷贝
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。
浅拷贝有一个问题:如果把对象里的值完全复制给另一个对象,如A=B(浅拷贝的话)。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
3.关联容器用过吗?
4.一个类对象有多大?
和面试官交流,了解到实际上是想问我如果创建了一个类对象,我如何计算他占用的内存大小。
5.析构函数可以是虚函数吗?
可以。考虑动态绑定。如果是基类指针去操纵子类的对象,且基类析构函数不是虚函数,那么delete这个指针的时候,就无法释放子类的资源。造成对象只释放了一半。
6.虚函数指针在哪里?
和面试官交流,发现他并不是只是想知道和编译器有关,有的在最开头这种。
而是想问指针在内存的哪一个区。
虚函数指针应该和对象在一起,对象在哪个区,它就在哪个区。
虚函数表我后来查了,认为可能是在全局区。GCC编译器下是在rodata区。
7.常见的排序算法
8. vector是如何动态增长的
2.操作系统
1.进程和线程的区别是什么?
(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
2.进程之间通信方式
共享内存、管道、优先队列、消息、soket套接字
3. vector接口是线程安全的吗?
这个是完全不会的。其他的不会的我是感觉还能分析分析,这个就真的不会
我觉得是线程不安全的,我设计了一个多线程的简单程序,也不知道能不能说明:
#include <vector>
#include <iostream>
#include <Windows.h>
#include <thread>
#include <tchar.h>
using namespace std;
vector<int> a;
void my_thread1()
{
for(int i=0;i<3;++i)
a.push_back(10);
}
void my_thread2()
{
for(int i=0;i<2;++i)
a.pop_back();
}
int _tmain(int argc, _TCHAR * argv[])
{
thread t(my_thread1);
thread t1(my_thread2);
t1.join();
t.join();
for(int i=0;i<1;++i)
cout<<a[i];
return 0;
}
大家都知道先创线程后写join是没有用的,是没有加锁的,所以我认为这就是一个没额外加锁的多线程。程序运行中崩溃了,是out of range。
我感觉是可以证明是不安全的。如果把t.join放在空白地方,即加了锁就是可以实现相应的功能的。
如果不对的话,请大神教我一下~谢谢
计算机网络
这块都还开始看书。。都不太会。面试官也说我这块答得不太好。
1.四层协议了解吗?
2. TCP/IP有哪些协议?
当时我没反应过来,我以为是问运输层网络层什么的有什么协议。。。
实际上不是:
网络层:IP协议、ICMP协议、ARP协议、RARP协议。
传输层:UDP协议、TCP协议。
应用层:FTP(文件传送协议)、Telenet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议。
其他记不得啦。。