秋招复习-C++(二)

1.Segmentation Fault是什么?什么情况下会导致它的出现?怎么解决?

     Segmentation Fault中文是段错误,在Linux系统中,段错误一般是是由用户程序非法访问内存引起的(访问指读、写或者执行),即程序访问的内存超出了系统所分配的内存空间,就会出现以上错误。段错误就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的(SIGSEGV)。

     引起段错误的原因可能有多种,总结如下:1.程序中企图用指针修改常量字段的值(常量字段是存放在只读存储区,受操作系统保护,只能读,不能写);2.访问了不属于进程地址空间的内存(程序中直接访问某个地址对应的内存,没有考虑是否在进程的地址空间);3.访问不存在的内存,最常见的就是对空指针进行解引用(Null);4.内存访问越界,最常见的就是数组访问越界(ps:指针越界一般来说不会出现SIGSEGV,但是如果对越界的指针进行解引用就会出现SIGCSEGV);5.栈溢出(俗称栈爆了)也会引起段错误,最常见的就是程序中递归次数太多而导致栈溢出,从而引起SIGSEGV; 6.printf,sprintf函数将非字符串的数据以字符串形式打印(可以看一下printf的源码就知道原因)。

    解决方法:段错误是平时我们调试过程中碰到过的最常见的错误之一,但往往这些问题不容易被发现(从上面的原因分析来看大多是小问题),需要利用一些小技巧来帮助我们更高效地定位问题所在并改正。一般来说,我们可以利用以下两种方式来找出问题所在:

  (1)在程序关键部分加入printf语句,打印调试信息,以跟踪段错误在代码中可能的位置为了方便使用这种调试方法,可以用条件编译指令#ifdef DEBUG和#endif把printf函数给包含起来,编译的时候加上-DDEBUG参数就可以查看调试信息。反之,不加上该参数进行调试就可以(调试小型程序可以使用)。

  (2)在LInux平台可以利用GNU提供的gdb工具来实现对程序的调试,使用也非常方便,只需要在使用gcc/g++编译的时候加上-g参数选项即可,然后就可以利用gdb的加断点、单步运行、打印变量值等操作进行程序的调试和问题的定位了,比较适合大型程序的调试(c/c++调试神器),效率也还不错,建议抽空学一下怎么使用。

 具体分析可以参考这篇博客:https://blog.csdn.net/u010150046/article/details/77775114

2.fork函数的机制和vfork函数的机制

    在Linux系统中fork函数用于创建新的子进程该函数没有参数,返回值有三种情况,对于父进程,fork函数返回子进程的进程ID(由内核分配),对于子进程会返回0,如果出错则返回-1,因此我们在程序中可以根据fork的返回值来编写相应进程的程序。fork创建的子进程复制了父进程的地址空间,一般来说如果没有执行exec系统调用,那么子进程复制了父进程的数据段和堆栈段,共享父进程的代码段,注意这里并没有复制父进程的代码段。当子进程中执行exec系统调用之后,内核就会为子进程分配代码段的地址空间,这样,在创建一个子进程后,子进程的地址空间完全和父进程分开,父子进程是两个独立的进程。

   Linux提供一个功能类似于fork函数的函数vfork,其作用是创建一个完全共享父进程地址空间的子进程,包括代码段+数据段+堆栈段。子进程对共享资源进行的修改,也会影响到父进程。vfork函数产生的子进程一定比父进程先运行。即父进程调用了vfork函数后会等待子进程运行后再运行。

3.Effective C++总结

  可以参考这篇博客:https://blog.csdn.net/cz28274815/article/details/38553755(精简版)

4.数据库部分

(1)视图:提供数据库的安全性保证,即通过视图可以限制数据库被访问的范围,有利于保护机密数据。

(2)BMS提供DML实现对数据的操作。嵌入高级语言中使用的 DML称为宿主型

(3)E-R图中的属性可以表示为关系模式的属性(数据库逻辑设计)

5.C++中引用和指针的相互转换怎么实现?

   引用是一种机制,不是数据类型,因此没有引用的引用和引用的指针的概念,对引用取地址其实是取引用所指向的对象的地址,而指针是一个变量,其值可以改变,指针指向一个具体的变量 ,对指针取引用于普通引用没有区别。举一个例子,一个函数的形式参数是Int& a,而我们需要将一个int* p(已经初始化)作为实际参数传进去,我们可以考虑对p进行解引用然后再传给形参,即将*p传给该函数。

6.exec函数族调用

可以参考这篇博客:http://blog.sina.com.cn/s/blog_62ef2f1401011wmo.html

7.Linux内存管理机制

    Linux内存管理主要分为内核空间和用户空间管理,内存管理的目的是为了提高内存分配的效率,减少内存碎片的产生从而提高内存的使用效率。具体可以参考这篇博客:

  https://blog.csdn.net/u012398362/article/details/53366186

  Linux的内存管理非常重要,在面试中也会经常问到,建议多花时间去了解。

 -------------------------------------------------------------------------------------------------------------------

     以上是我自己根据网络上的资料整理出来的,目的是方便自己查看复习,参考了一些大神的博客,原文里放上了链接,感谢大神们的分享。如有错误,望批评指出。

  

 

  

 

posted @ 2018-08-04 18:15  晴天Jay_chen  阅读(585)  评论(0编辑  收藏  举报