1、C/C++内存泄漏
(1)基类的析构函数没有定义为虚函数;
(2)缺少拷贝构造函数或重载赋值运算符;
两次释放相同的内存是一种错误的做法,同时可能会造成堆的崩溃。按值传递会调用(拷贝)构造函数,引用传递不会调用。
所以一个类中有指针变量时,要么显示的写拷贝构造函数和重载操作符函数,要么禁用拷贝构造函数和重载操作符。
(3)在释放对象数组时,在delete中没有方括号。
(4)没有正确清楚嵌套的对象指针;
(5)指向对象的指针数组不等同于对象数组。
对象数组是指每个数组存放的是对象,只需要delete []p.即可调用对象数组中每个对象的析构函数释放空间。
指向对象的指针数组只是数组中存放的是指向对象的指针,不仅要释放每个对象的空间,还要释放每个指针的空间。即 delete []p只是释放了每个指针,但是并没有释放对象的空间。正确做法是,循环释放每个对象,然后再把指针释放掉。
(6)在类的拷贝构造函数和析构函数中没有匹配的调用new 和delete 函数。
2、什么是野指针?
野指针是指指向被释放的或者访问受限内存的指针。
造成野指针的原因有哪些?
(1)指针变量没有被初始化。
(2)指针P被free掉或者delete后,没有置为NULL。
(3)指针越界访问内存;
3、多线程与多进程有哪些区别?多线程有哪些优势?
(1)进程是系统资源分配的基本单元,线程是CPU调度的基本单元。
(2)不同的进程有自己的地址空间,一个进程至少包含一个线程,多个线程可以共享一个进程中地址空间。线程没有自己的地址空间,但是线程也可以有自己少量的内存空间,如寄存器和栈等。
(3)进程相对来说,系统开销大;线程开销相对小。
线程优势:
(1)在做让两件事同时在做在运行时,用线程来实现比进程相对来说简单容易些。因为不同的进程间需要紧密合作才能满足加锁和数据一致性方面的需求。
(2)一个进程里可以包含多个线程,这样可以提高程序的运行效率。如果一个进程在任意时刻只能做一件事的话,线程可以让它在等待连接之类的事情的同时还可以做其它事情。
(3)线程之间的切换快。
缺点:
(1)进程间程序是实现起来简单,但是多线程程序设计需要非常仔细的设计,尤其是变量共享引发的错误。
(2)对多线程程序之间的调试相对来说比较困难。
3、线程之间用于同步的方式有哪些?
(1)信号量
信号量分为二进制信号量和计数信号量。信号量常用来保护一段代码,如果每次只能被一个执行线程运行,完成它,就需要使用二进制信号量;如果希望允许多个线程执行一段代码,就需要使用计数信号量。
(2)互斥量
它允许程序员锁住某个对象,使得每次只能有一个线程访问它。
4、程序中如何设计防止死锁?
死锁是多个进程因竞争资源而造成的一种僵局互相无休止的等待下去。导致两个进程陷入死锁的状态。
产生死锁的原因:
(1)互斥条件。一个资源每次只能被一个进程占用。若其它进程想获得这个资源,只能等待。
(2)请求与保持条件。一个进程已经保持了至少一个资源,但又提出了新的资源请求,但是该资源已经被其它进程占有u,此时的请求就会阻塞,但是对自己已经获得的资源还保持不放。
(3)不可剥夺条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程中使用完事时自己释放。
(4)循环等待条件。在发生死锁时,必然存在一个进程一资源的循环链,即进程集合{p,p1,p2,.....}p0等待p1的占用的资源,。。。。
处理死锁的方法:
(1)预防死锁。通过设置某些限制条件,去破坏产生死锁的四个必要条件之一或者几个来预防死锁。
(2)避免死锁。它不是事先采取各种限制条件去破坏四个条件之一,而是在资源动态分配活动中,用某种方法防止系统进入死锁状态。
(3)检查死锁。
(4)解除死锁。常用的方法是撤销一些进程,回收资源。
如何预防死锁的产生?
合理的分配系统资源;破坏死锁产生的四个必要条件之一;合理的安排进程的推进顺序。
5、TCP与UDP的区别?
6、helper进程给PROXY进程发hello包,怎样确认对方已经收到?
解析报文,查看发送的报文的类型。