秋招复习-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的内存管理非常重要,在面试中也会经常问到,建议多花时间去了解。
-------------------------------------------------------------------------------------------------------------------
以上是我自己根据网络上的资料整理出来的,目的是方便自己查看复习,参考了一些大神的博客,原文里放上了链接,感谢大神们的分享。如有错误,望批评指出。
秋招复习-C++(二)的更多相关文章
- 秋招复习-C++( 一)
Linux/Unix编程部分 1.进程间通信方式:信号,信号量,消息队列,共享内存,套接字Socket 2.ipcs: Linux/Unix下的命令,可以用来查看当前系统中所使用的进程间通信方式的各种 ...
- 秋招复习-C++(三)
• 数据库 1.数据库的索引有哪些? (1)B树索引:利用B树作为底层数据结构的索引,在B树索引中保存索引列的值和数据表的对应行的ID,每一个叶子结点都存放着一个索引列的值和数据表对应行的ID,通过这 ...
- Java Collection秋招复习
抽象类和接口的区别 我们先来看一下抽象类 * @auther draymonder */ public abstract class AbstractClassTest { private int T ...
- 9.秋招复习简单整理之Spring面试AOP和IOC的理解
1.Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系,但不适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用 ...
- 8.秋招复习简单整理之Spring面试一般问题
1.不同版本的Spring Framework有哪些主要功能? 2.什么是Spring Framework? Spring是一个轻量级的IOC和AOP容器框架,是为Java应用程序提供基础性服务的一套 ...
- 7.秋招复习简单整理之请你讲讲 Statement 和 PreparedStatement 的区别?哪个性能更好?
Statement和PreparedStatement都是数据库用于执行SQL语句的句柄,但是PreparedStatement代表一个预编译的SQL. 以下是PreparedStatement和St ...
- 6.秋招复习简单整理之请你谈谈JDBC的反射,以及它的作用?
通过反射com.mysql.jdbc.Driver类,实例化该类时会调用该类的静态代码块,该代码块会去java的DriverManager类中注册自己,DriverManager管理所有已注册的驱动类 ...
- 5.秋招复习简单整理之请介绍一下List和ArrayList的区别,arrayList和HashSet区别?
第一问:List是接口,ArrayList是List的实现类. 第二问:ArrayList是List的实现类,HashSet是Set的实现类,List和Set都实现了Collection接口. Arr ...
- 4.秋招复习简单整理之java支持多继承吗?
java仅支持单继承,但支持接口多实现.
随机推荐
- 洛谷 - P1426 - 小鱼会有危险吗 - 模拟
https://www.luogu.org/problemnew/show/P1426 题目说的是小鱼进入探测器一秒后就会有危险,所以不应该让小鱼先游,而是先检测探测器. #include<bi ...
- composer下载tp5第三方扩展
(谨记:如果使用 composer 命令安装失败,请查看根目录下的 composer.json 文件是否正确,并查看下的扩展是否有多个版本,下载的版本是否符合当前框架的版本) 1.基础 compose ...
- 机器学习--DIY笔记与感悟--②决策树(1)
在完成了K临近之后,今天我们开始下一个算法--->决策树算法. 一.决策树基础知识 如果突然问你"有一个陌生人叫X,Ta今天需要带伞吗?", 你一定会觉得这个问题就像告诉你& ...
- Unity3D NGUI UIPlayTween(原UIButtonTween)动画事件详解
http://blog.csdn.net/asd237241291/article/details/8507817 原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术 ...
- NOIp2005 过河【dp+离散化】By cellur925
题目传送门 $30pts$ 状态和转移都比较好想:设$f[i]$表示跳到$i$位置,踩到的最小石子数.转移方程也很明了,为$f[i]$=$min${$f[i-j]$),,这个位置有石子时答案再加1,$ ...
- the little schemer 笔记(9)
第九章 ...and Again, and Again, and, Again, ... 你想来点鱼子酱吗? 那就去找它吧. (looking a lat)是什么,其中a是 caviar, lat是( ...
- DataTable数据检索的性能分析[转]
原文链接 作者写得非常好,我学到了许多东西,这里只是转载! 我们知道在.NET平台上有很多种数据存储,检索解决方案-ADO.NET Entity Framework,ASP.NET Dynamic D ...
- linux高负载下mysql数据库彻底优化
同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或 ...
- python工具之日志记录
''' 写日志类 日志存放目录为当前应用程序的目录下的log目录中 日志产生规则:每小时产生一个文件 write by :wujf 2017-02-24 ''' import sys import o ...
- Git之远程项目克隆到本地配置
远程代码克隆到本地工作区,需要进行简单的配置,用于识别身份 1.git config --global user.name [设置用户名,你的github用户名] 2.git config -- ...