秋招复习-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仅支持单继承,但支持接口多实现.
随机推荐
- E20170426-gg
recursive adj. 回归的,递归的; removal n. 除去; 搬迁; 免职; 移走; customize vt. 定制,定做; 按规格改制;
- 一道简单的 Java 笔试题,但值得很多人反思!
前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要 ...
- 纯JS实现鼠标每隔一段时间才能让页面再次滚动
这里没有用到浏览器的兼容性写法,只是提供思路(这里使用的是Google浏览器的方法) javascript代码部分: //获取html元素var oHtml =document.documentEle ...
- Nginx系列篇二:linux搭建Nginx负载均衡
建议先搭建好Nginx环境 可阅读--->Linux中搭建Nginx 1.准备好三台服务器[标配] 一.nginx负载均衡服务器:192.168.102.110,配置好Nginx 二.tomca ...
- websocket实现群聊
server # @File: 群聊 from flask import Flask, render_template, request from geventwebsocket.handler im ...
- 基于Tcp协议的上传下载
目录格式: 构建此目录就可随意使用! client端 import socket import sys import os import json import struct sk = socket. ...
- 学习JavaScript数据结构与算法 (一)
学习JavaScript数据结构与算法 的笔记, 包含一二三章 01基础 循环 斐波那契数列 var fibonaci = [1,1] for (var i = 2; i< 20;i++) { ...
- 题解报告:hdu 4607 Park Visit(最长链)
Problem Description Claire and her little friend, ykwd, are travelling in Shevchenko's Park! The par ...
- JAVA常用知识总结(三)——JAVA虚拟机
先附一张JAVA虚拟机内存结构图: 其中JAVA虚拟机的线程问题<为什么JAVA虚拟机分为线程共享和非线程共享?>一文中已经有详细介绍,本文从面试中常问的一些JAVA虚拟机问题出发,主要从 ...
- js数据类型之判断
js有几种类型,具体是:字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空(Null).未定义(Undefined). js提供了typ ...