天美一面 后台开发(凉)
天美一面 后台开发(凉)
自我介绍
C++用什么版本?
C++11
3个全局变量相互依赖,在程序中该如何初始化
答:手动分析、依赖关系转为类间的继承关系
反问:3个变量手动分析,那300个变量呢?
答:不会
全局静态变量和函数静态变量的初始化顺序
全局静态变量先初始化,第一次调用函数时,初始化函数内的静态变量
全局静态变量和全局非静态变量的初始化顺序
这个当时说的是先初始化全局静态,再全局非静态,说错了。
应该是无特定顺序,先定义则先初始化。
谈一下对多态的理解
静态多态:函数重载,函数名相同但参数列表不同,简单说了下使用场景
动态多态:子类对父类的虚函数重写,虚函数表
虚函数表的存储位置
运行时刻能把虚函数表拿出来吗
虚函数表指针存储位置
对象的头部字节
拿到虚函数表地址后,是否可以改写虚函数表的内容
虚函数表在代码段,不可以被修改,否则会引发段错误。
题目一
class Test
{
public:
void hello() {
printf("hello\n");
}
};
int main()
{
Test *p = nullptr;
p->hello();
return 0;
}
问:上述代码可以编译通过吗?可以执行吗?
答:虽然p指向空,但其类型被编译器解释为Test,可以正常调用hello函数,但这种空悬挂指针实际上是未定义行为。
问:p可以正常调用hello吗?可以正常执行吗
答:(内心OS:???)可以执行
问:假如Test有个父类,hello函数重写了父类的hello函数,还能执行吗?
答:可以
说一下虚拟内存
Linux上有个二进制程序一直在运行,修改代码后重新编译把原来的二进制程序覆盖了,会怎么样?
当时答的是原程序被操作系统加载进内存,不会受到影响,但好像不对。
进程占用的内存比较多,该怎么调试是什么情况?
free可以查看已使用/已分配/已缓存的内存大小
htop查看每个进程的虚拟内存/物理内存使用大小
定位到一个进程的内存比较异常,该如何进一步查找为什么内存会异常
答:valgrind/asan可以给出内存泄漏的位置和大小
问:一般是不太精确的,该怎么找出是哪一段代码引起泄漏
答:工具+人工看代码
问:代码量太大,人工不现实
外网用户连接不到服务器,该怎么排查是什么原因造成的
不会,完全瞎扯。
一开始从客户端的角度去说,能否ping通服务器,dns设置等等,但面试官表示不应该让用户去做这些。
然后又从服务器角度说,可能用户被服务器黑名单封禁。但面试官也不满意。