2019深信服一面
1、如何判断一个进程崩溃了?
2、什么情况下会引起程序崩溃?
1、读取未赋值的变量
没有给变量初始化和赋值,导致该变量的值为脏值。
2、函数栈溢出
函数栈溢出一般是由两种情况引起的:
1、定义了一个体积太大的局部变量或者参数,参数和局部变量一般都是存储在栈中的,但是栈所占的内存空间很小,在32位下只占有8M的空间,因此如果没有使用malloc和new来在堆上创建内存空间的话,栈溢出就会很容易发生。
2、函数的嵌套调用的层次太深了,就像无穷递归和无穷的循环调用一样。
3、数组访问越界
4、指针的目标对象不可用
指针所指向的对象要正常使用,它就必须是一个合法的,有效的,可以访问的对象,像当指针为空指针或者是野指针时,你再使用它程序就会立马崩溃。而出现空指针或者野指针一般都是下面这几种操作导致的:
1、指针未赋值
2、free/delete释放了该对象
3、不恰当的指针强制类型转换
3、内存溢出会造成什么问题?
4、标准I/O和系统I/O的区别?什么情况下使用标准I/O,什么情况下使用系统I/O?
详见以下参考:
标准IO跟系统IO
5、使用fopen()打开文件,没有使用fclose()打开文件会发生什么?fopen()返回的是什么类型的指针?
如果文件被打开再被删除,在文件不被关闭的情况下,原文件占用的空间不会被释放,这样可能会出现磁盘空间不足的问题。
FILE* fopen(const char * path,const char * mode);
// path: 文件名
// mode:打开模式
返回一个FILE类型的指针,FILE结构体定义如下:
typedef struct {
short level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
short bsize; /* Buffer size */
unsigned char *buffer; /* Data transfer buffer */
unsigned char *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object */
6、统计一篇文章所有单词出现的次数,找出出现次数最多的10个单词。
思路: 分治法 + hash + 小根堆
(1) 定义一个关联容器hash_map<string,int>,用于统计英文文章中每个单词出现的次数;定义一个vector<hash_map<string,int>::iterator>,用于存储小根堆K;
(2) 将英文文章中的前K个单词先填满topK堆;
(3) 调整topK堆为小根堆结构;
(4) 通过遍历将后面的单次出现的次数与堆顶单词出现的次数(此时堆顶单词出现的次数最小)比较,大于堆顶元素就入堆,并下调堆结构。
(5) 遍历结束,则小根堆中的单词即英文文章中频次出现最高的10个单词。