秋招复习-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仅支持单继承,但支持接口多实现.
随机推荐
- Unity Transform常识(转)
Variables position: Vector3 物体在世界坐标中的位置. transform.position=Vector3(10,10,10)//把物体放到(x=10,y=10,z= ...
- vim 不同的插入方式
在命令行模式下进入到输入模式 可以敲击 i.a.o. s. I. A. O. S 它们之间的区别做下备忘:i:在光标所在字符前开始插入a:在光标所在字符后开始插入o:在光标所在行的下面另起一新行插入s ...
- camshift.py OpenCv例程阅读
源码在这 #!/usr/bin/env python ''' Camshift tracker ================ This is a demo that shows mean-shif ...
- Python while 1 和 while True 速度比较
References http://legacy.python.org/dev/peps/pep-0285/http://stackoverflow.com/questions/3815359/whi ...
- The Specials Menu LightOJ - 1025
The Specials Menu LightOJ - 1025 题意:在给定的字符串中删去一些字符,使其成为回文串(不能全部都删).求方案数. 方法:常规的区间dp.ans[i][j]表示在i到j的 ...
- python_面向对象进阶(7)
第1章 面向对象特性—继承(补充) 1.1 接口类.抽象类介绍 1.2 接口类 1.3 接口类应用过程 1.3.1 第一版:完成多种支付方式接口 1.3.2 第二版: 归一化设计,统一支付方式 1.3 ...
- 浅析 Spark Shuffle 内存使用
在使用 Spark 进行计算时,我们经常会碰到作业 (Job) Out Of Memory(OOM) 的情况,而且很大一部分情况是发生在 Shuffle 阶段.那么在 Spark Shuffle 中具 ...
- PHP在不同页面间传递Json数据示例代码
gettest.php文件: <?php $value["name"]= urlencode("我的姓名"); $value["pass&quo ...
- AJPFX总结内部类
内部类:内部类的访问规则:1. 内部类可以直接访问外部类中的成员,包括私有 原因是内部类中持有了一个外部类的引用,格式:外部类.this2. 外部类要访问内部类,必须建立内部类对象访问格式:1. ...
- 分布式数据存储 之 Redis(二) —— spring中的缓存抽象
分布式数据存储 之 Redis(二) -- spring中的缓存抽象 一.spring boot 中的 StringRedisTemplate 1.StringRedisTemplate Demo 第 ...