1、new和malloc的区别
new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存;
new内存分配失败时会抛出bac_alloc异常,malloc分配内存失败时返回NULL;
new会调用构造和析构,malloc不会;
2、什么时候使用多进程,什么时候使用多线程
这个问题我没有找到答案,自己强行答一下:
线程是共享资源的,所以在稳定性方面会差一些,比如读取写入的时候可能有冲突,但线程创建和销毁的代价很小,当需要经常创建销毁的时候可以使用线程,当为了稳定性的时候可以使用进程。
3、野指针来源和解决方法
来源一:指针变量声明时没有被初始化。
解决办法:指针声明时初始化,可让它指向NULL,不能悬空。
来源二:指针被释放掉之后,没有置为 NULL。
解决办法:指向NULL,不能悬空。
来源三:指针操作超越了变量的作用范围。
解决办法:在变量的作用域结束前释放掉变量的地址空间并且让指针指向NULL。
4、并行和并发区别
并发是指一个处理器同时处理多个任务(分片处理)。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务(跟分片没有关系)。
5、段内存
就是内存四区里面的bass段,data段
6、C++有哪些性质(面向对象特点)
封装,继承和多态。
7、子类析构时要调用父类的析构函数吗?
看情况:
1、父类指针指向子类,且析构函数为非虚函数:只调用父类的析构函数;
2、父类指针指向子类,且析构函数为虚函数:先调用子类虚构,再调用父类析构;
3、子类指针指向子类:先调用子类析构,再调用父类析构;
定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。
8、纯虚函数和抽象类
虚函数是为了派生类重新定义基类的函数,如果基类的函数只做了声明没有实现,这个函数就称为纯虚函数。
如果一个类至少有一个纯虚函数,那它就是抽象类,抽象类不能创建实例。
9、bool、int、float 分别判空操作
if ( !a ) or if(a)///bool
if ( a == 0)//int
float : const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)//float
10、C++函数中值的传递方式有哪几种?
值传递、指针传递和引用传递。
11、内联函数
是为了提高运算效率,但是要求代码简单,且没有循环
12、如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
#ifdef __cplusplus
cout<<“c++";
#else
printf("c");
#endif
13、引用与指针有什么区别?
- 引用必须被初始化,指针不必。
- 引用初始化以后不能被改变,指针可以改变所指的对象。
- 不存在指向空值的引用,但是存在指向空值的指针
14、用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用 sizeof() 函数。
int a = ~0;
if(a > 65536) {
cout<<"32 bit"<<endl;
} else {
cout<<"16 bit"<<endl;
}
15、TCP的黏包和拥堵机制解决
1、发送数据包的时候,连着数据包大小一起发送
2、用特殊的符号作为消息包的分隔符
16、多线程间通信有哪些方式
17、SQL语句
select * from tabel where `字段` = “XX”;
18、C++11新特性
19、设计模式
几大准则,简单工厂模式,工厂方法模式,抽象工厂模式,单例
20、Tcp建立连接三次握手
21、Socket的阻塞非阻塞,同步异步的区别
22 、重载和覆盖有什么区别?
重载是编写函数名相同,参数列表不同的函数。覆盖也叫重写,重写的函数必须有一致的参数表和返回值。
22 、什么情况下用重载,什么情况下用覆盖?
派生类重写基类的虚函数用覆盖。实现同一功能有不同参数列表的函数用重载。
23、他们是怎么实现的?
重载是在编译阶段就知道要调用的函数地址,属于早绑定,是静态的;覆盖要在运行时绑定函数地址,属于晚绑定,是动态的。
24、编译步骤
在main.cpp文件到可执行文件中,有这几步,此处建议动手试一试,总结为E->S->C(戏称ESC):
1、预编译器------->main.i;宏展开,引入头文件
g++ -E main.cpp -o main.i
2、编译器------->main.s(汇编文件),此时还是能看懂的;
g++ -S main.i -o main.s
3、汇编器------->main(目标文件,Windows为.obj,Linux为.o),为二进制,此时已经看不懂;
g++ -C main.cpp -o main.o
4、链接器------->main.exe;(可执行文件)将各个.o文件合起来
g++ main.s -o main
25、友元函数
能访问其他类的私有成员和保护成员
25、socket流程
服务端:socket(),bind(),listen(),accept(),read(),write()
客户端:socket(),connect(),read(),write()
25、多线程通信(互斥锁、信号量),select、epoll的区别
临界区
25、线程池,多个线程频繁申请内存和释放内存会有什么问题,怎么解决。
线程创建和销毁有很大代价,因此使用线程池。申请许多线程排队等待,当有任务出现的时候,就分配给一个线程执行,该线程执行完后不结束,返回到等待状态。
25、进程间通信的方式,常用哪些通信?
管道
26、STL,迭代器
vector 双向链表
list 向量容器
deque 双端队列
- 正向迭代器,定义方法如下:容器类名::iterator 迭代器名;
- 常量正向迭代器,定义方法如下:容器类名::const_iterator 迭代器名;
- 反向迭代器,定义方法如下:容器类名::reverse_iterator 迭代器名;
- 常量反向迭代器,定义方法如下:容器类名::const_reverse_iterator 迭代器名;
27、静态函数的作用
1、限定函数作用域,只能在本文件访问;
2、使得可以有另一个重名函数