1 在 C++ 被 程序中调用被 C C 编译器编译后的函数,为什么要加 extern “C” 声明?
函数和变量被 C++编译后在符号库中的名字与 C 语言的不同,被 extern “C”修饰的变量和函数是按照 C 语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用 C 函数。C++提供了一个 C 连接交换指定符号 extern“C”来解决这个问题。
2. C 中 static 有什么作用?
(1)隐藏。
当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性,故使用 static 在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
(2)static 的第二个作用是保持变量内容的持久。
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和 static 变量。
(3)static 的第三个作用是默认初始化为 0.
其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是 0×00,某些时候这一特点可以减少程序员的工作量。
3. 内联函数 inline 和宏定义一起使用的区别。
内联函数是在编译的时候已经做好将对应的函数代码替换嵌入到对应的位置,适用于代码较少的函数。宏定义是简单的替换变量,如果定义的是有参数的函数形式,参数不做类型校验
4 delete []arry 和 和 delete arry 一样吗?不一样请说明;
delete []arry 释放的是多个同一类型的地址空间
delete arry 释放的是一个某种类型的地址空间
5. 内存泄漏
未对作废数据内存单元置为 null,尽早释放无用对象的引用,使用临时变量时,让引用变量在推出活动域后自动设置为 null,暗示垃圾收集器收集;
程序避免用 String 拼接,用 StringBuffer,因为每个 String 会占用内存一块区域;
尽量少用静态变量(全局不会回收);
不要集中创建对象尤其大对象,可以使用流操作;
尽量使用对象池,不再循环中创建对象,优化配置;
创建对象到单例 getInstance 中,对象无法回收被单例引用;
服务器 session 时间设置过长也会引起内存泄漏。
6.请描述平衡二叉树.
平衡二叉树,左右高度之差不超过 1,Add/delete 可能造成高度>1,此时要旋转,维持
平衡状态,避免二叉树退化为链表,让 Add/Delete 时间复杂度但控制在 O(log2N),旋
转算法 2 个方法,1 是求树的高度,2 是求 2 个高度最大值,1 个空树高度为-1,只有 1
个根节点的树的高度为 0,以后每一层+1,平衡树任意节点最多有 2 个儿子,因此高度
不平衡时,此节点的 2 棵子树高度差为 2。例如单旋转,双旋转,插入等。
红黑树放弃完全平衡,追求大致平衡,保证每次插入最多要 3 次旋转就能平衡。
7. 请问溢出的原因?
是否递归的调用;
大量循环;
全局变量是否过多;
数组,List,Map 数据是否过大;
用DDMS 工具检查地方。
内存溢出的原因
过多使用了 static;static 最好只用 int 和 string 等基本类型;大量的递归或者死循环;大数据项的查询,如返回表的所有记录,应该采用分页查询。检查是否有数组、List、map 中存放的是对象的引用而不是对象,这些引用会让对应对象不能被释放。
栈过大会导致内存占用过多,频繁页交换阻碍效率。
8. 一个线程池正在处理服务如果忽然断电该怎么办?
队列实现持久化储存,下次启动自动载入。
但是实际需要看情况,大体思路是这样。
添加标志位,未处理 0,处理中 1,已处理 2。每次启动的时候,把所有状态为 1 的,置为 0。或者定时器处理
关键性的应用就给电脑配个 UPS。
9. 红黑树的特点?
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。注意:这里叶子节点,是指为空(NIL 或 NULL)的叶子节点!
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。[这里指到叶子节点的路径]