面试
码肥人壮
三好员工: 好困好饿好想下班。
展开
-
信号槽绑定失败原因
1、信号槽参数未被注册。需要使用qRegisterMetaType进行注册。2、对象未声明Q_OBJECT宏。3、信号、槽对象未被实例化。原创 2022-03-25 14:33:04 · 514 阅读 · 0 评论 -
google_breakpad crash检测
1 breakpad介绍google_breakpad是一个由google主导的开源项目,官方介绍为:An open-source multi-platform crash reporting system,即 开源的多平台崩溃上报系统。这是由google员工在工作中那20%的自由创造时间创造的作品,真正对技术热爱的人才会在自由时间改变世界,只完成工作的人永远只能做一把被人用完就丢的枪。2 支持google breakpad 支持iOS linux windows,但是注意,不支持mingw64原创 2022-02-11 13:24:46 · 969 阅读 · 0 评论 -
mtrace内存泄漏工具的使用方法
原理:mtrace 工具的主要思路是在我们的调用内存分配和释放的函数中装载 “钩子(hook)” 函数,通过 “钩子(hook)” 函数打印的日志来帮助我们分析对内存的使用是否存在问题。具体的做法是 mtrace() 函数中会为那些和动态内存分配有关的函数(譬如 malloc()、realloc()、memalign() 以及 free())安装 “钩子(hook)” 函数,这些 hook 函数会为我们记录所有有关内存分配和释放的跟踪信息,而 muntrace() 则会卸载相应的 hook 函数。基于这原创 2021-02-04 14:05:43 · 1777 阅读 · 2 评论 -
C++多态全面解析
快来了解C++多态到底是怎么回事?原创 2022-01-17 15:19:36 · 561 阅读 · 0 评论 -
隐式共享与浅拷贝、深拷贝的关系
深拷贝和浅拷贝的示意图大致如下:1.浅拷贝:浅拷贝只复制指向某个对象的指针,源对象与拷贝对象共用一份实体(内存段),仅仅是引用的变量不同(名称不同),而不复制对象实体本身,新旧对象还是共享同一块内存。简而言之,浅拷贝可以拷贝这个对象的变量,但是不能拷贝这个对象所引用的对象。浅拷贝就像一个队伍(疾风队)五个人,他们又新建了一个队伍叫德玛西亚队,里面的五个成员名(位置:上单、中单、下单、辅助、打野)也拷贝过去了,但是每个位置的成员还是疾风队的那五个人,并没有招来新人加入。2.深拷贝:深拷贝会另外创造原创 2021-03-17 22:02:06 · 324 阅读 · 0 评论 -
delete基类指针释放子类对象
1、首先需要了解父类和子类的内存分布如下图,B类(子)继承A类(父):2、其次就是delete删除对象原理delete就是依据指针指向的内存地址,如何删除内存数据,具体删除多少呢?那就看指针类型了。如果指针类型为A*,那就删除A类大小的内存。3、按1、和2中的内容,那么冒出一个问题!看如下代码:A* a = new B(); //按上图方式,B继承于Adelete a;父类指针指向子类对象的情况会怎么删除?依据上面内容推测,B类中的A对象段的内存将会被删除,而剩余的B自己的数据原创 2021-09-05 11:15:34 · 3501 阅读 · 2 评论 -
重写与覆盖的区别
本质区别就是: 重写会改变父类的方法,而覆盖则不会。没理解可以看如下代码:class A{public: virtual string GetName_1() //虚函数 { return "A_Class"; } string GetName_2() //非虚函数 { return "A_Class"; }};class B : A{public: string GetName() //重写A类中的原创 2021-09-02 23:30:33 · 3472 阅读 · 2 评论 -
手写C++堆排序
1 堆排序原理2 快速排序函数2.1 标准库#include <algorithm>标准库算法库中的堆相关函数make_heap()用于把一个可迭代容器变成一个堆,默认是大顶堆。sort_heap()是将堆进行排序,排序后,序列将失去堆的特性(子节点的键值总是小于或大于它的父节点)。 make_heap(v.begin(),v.end()); sort_heap(v.begin(),v.end()); make_heap 是按照给定的排序准原创 2021-08-26 14:55:38 · 371 阅读 · 0 评论 -
TCP/IP四层模型
OSI七层模型参考链接:https://blog.csdn.net/weixin_42887343/article/details/119885093五层模型五层体系的协议结构是综合了 OSI 和 TCP/IP 优点的一种协议,包括应用层、传输层、网络层、数据链路层和物理层。其中应用层对应 OSI 的上三层,下四层和 OSI 相同。五层协议的体系结构只是为介绍网络原理而设计的,实际应用还是 TCP/IP 四层体系结构。四层模型OSI 七层模型在提出时的出发点是基于标准化的考虑,而没有考虑到.原创 2021-08-24 11:20:04 · 3264 阅读 · 0 评论 -
OSI七层模型个人理解
个人比较喜欢从下往上理解,新手做笔记,如理解有误,欢迎评论纠正。物理层 — 传输线路的特性(机械特性、电气特性、功能特性,过程特性)物理层可以看作是一条线,定义了这条传输线的特性。作为 OSI参考模型中最低的一层,物理层的作用是实现计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。该层的主要任务是确定与传输媒体的接口的一些特性(机械特性、电气特性、功能特性,过程特性)。数据链路层 — 两个点通讯数据链路层可以看作是.原创 2021-08-24 11:06:12 · 3686 阅读 · 5 评论 -
main函数运行的前后执行函数
//在main函数之前运行__attribute((constructor))void before(){ printf("before\n");}//在main函数之后运行__attribute((destructor))void after(){ printf("after\n");}int main(int argc, char *argv[]){ printf("main\n"); return 0;}...原创 2021-08-17 15:03:01 · 458 阅读 · 0 评论 -
拷贝构造函数调用时间
1 当用类的一个对象初始化该类的另一个对象时如:int main(){ point A(1,2); point B(A);//用对象A初始化对象B,拷贝构造函数被调用.}2 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时void f(point p){}main(){ point A(1,2); f(A);//函数的形参为类的对象时,当调用函数时,拷贝构造函数被调用.}3 如果函数的返回值是类的对象,函数执行完成返回调用者时point g()原创 2021-08-17 14:48:42 · 142 阅读 · 0 评论 -
指针与引用的区别
不同点:类型的区别指针是指针变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。内存上的区别(1)指针是一个真正的对象,编译器会为其分配内存空间;而引用则是语法上的概念,作用是一个对象的别名,编译器并不一定总是会为引用分配内存空间。(2)"sizeof 指针"得到的是指针本身的大小;而"sizeof 引用"得到的是所指向的变量(对象)的大小。初始化的区别指针在定义时不必初始化,或者初始化为空;引用在创建时原创 2021-08-16 10:55:18 · 229 阅读 · 0 评论 -
类的不同实例化使用一张虚函数表
1 说明众所周知,每个带有虚函数的类,或者继承具有虚函数类的对象,本身都是会有一个虚函数表的,前者为自身创建的,后者为继承,且虚函数表的指针位置位于类的首四位地址,如下图所示!如何获取虚函数表地址?看下面代码:Obj obj;int vAddr = *(int *)(&obj); //获取虚函数表地址首先获取类地址,将类地址强制转为int类型数据(int数据地址),该地址保存的数据又是虚函数表的地址,所以使用去除地址中的虚函数表地址。有点绕口,可以自行理解。2 问题同一个类,实例化原创 2021-08-13 17:32:23 · 570 阅读 · 0 评论 -
解决哈希碰撞的方法
什么是hash表根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为哈希表,这一映像过程称为哈希造表或者散列,所得的存储位置称哈希地址或散列地址。什么是Hash哈希碰撞(也叫“冲突”)对应不同的关键字可能获得相同的hash地址,即 key1 ≠ key2,但是H(key1) = H(key2)。这种现象就是冲突,而且这种冲突只能尽可能的减少,不能完全避免。为什么不能完全避免?因为哈希函数原创 2021-08-12 17:38:02 · 6201 阅读 · 0 评论 -
手写C++快速排序
1、快速排序的原理2、代码原创 2021-08-11 18:44:38 · 424 阅读 · 0 评论 -
手写反转链表
手写反转链表在面试中是经常遇到的。反转前:反转后:原创 2021-08-11 17:42:31 · 104 阅读 · 0 评论 -
观察者模式
什么是观察者模式观察者(Observer)模式的定义: 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。对于观察者模式的理解,这里举个例子说明。用软件发布测试为例,每次软件发布,都需要出告知各个同事(大佬),比如项目经理、项目负责人、部门老大、测试部门的老大、以及测试人员等等。如果想让各位同事了解你的软件有没有发布测试,总不能麻烦各位大佬挨个隔一段时间问我们小小的软件开发吧!原创 2021-08-11 10:06:14 · 97 阅读 · 0 评论 -
类的大小问题分析
面试中经常问到什么什么情况下类的大小,下文统一分析一下。类的空间大小原则分析:空类内存不为0,为1字节。与成员函数和静态成员、函数无关。带有虚函数表的类(自身有虚函数或者继承虚类),类多了一个虚函数表指针,大小为编译器位数,即32位占4字节,64位占8字节类数据成员大小,注意类大小的计算遵循结构体的对齐原则的1、空类 - 1字节2、只有成员函数的类 - 1字节3、带有虚函数的类 - 4字节(32位) 8字节(64位)4、继承带有虚函数的类 - 4字节(32位) 8字节(64位)..原创 2021-08-06 15:18:47 · 156 阅读 · 0 评论 -
面试方向大纲
语言指针和引用的区别什么是多态,如何实现的静态多态和动态多态虚函数的工作方式什么是动态绑定虚表指针和虚函数表的存放位置虚函数表的存放内容多继承的虚函数表结构析构函数要设为虚函数吗,为什么构造函数可以是虚函数吗拷贝构造函数为什么传引用什么是纯虚函数如何在 main 函数之前执行一些操作static 关键字的使用静态函数和非静态函数的区别全局静态遍历和局部静态变量得区别define 和 const 的区别new跟malloc的区别为什么要引入newfree是如何识别fr原创 2021-08-06 14:55:17 · 91 阅读 · 0 评论 -
计算机网络面试的那些事
1. TCP的三次握手中,每一次握手的各类序号写一下?TCP第一次握手期间:客户机向服务器发送请求报文段,发送序号为 xxTCP第二次握手期间:服务器向客户机发送请求+确认报文段,发送序号为 yy ,确认报文段为 x+1x+1TCP第三次握手期间:客户机向服务器发送确认报文段,发送序号为 x + 1x+1,确认序号为 y + 1y+12. 第一次握手的seq序号是随机产生的嘛?首先,seq的全称为sequence number:表示的是发送方这边,这个packet的数据部分的第原创 2021-08-06 14:35:45 · 85 阅读 · 0 评论 -
异常和中断有何区别?
**中断:**是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;**异常:**是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。而中断则是由于系统中某事件引起的,该事件与现行指令无关。链接:https://leetcode-cn.com/circle/discuss/3xmp7u/来源:力扣(LeetCode)...原创 2021-08-06 14:31:22 · 3397 阅读 · 0 评论 -
听说过孤儿进程和僵尸进程嘛?
孤儿进程是父进程退出后它的子进程还在执行,这时候这些子进程就成为孤儿进程。孤儿进程会被init进程收养并完成状态收集。僵尸进程是指子进程完成并退出后父进程没有使用wait()或者waitpid()对它们进行状态收集,这些子进程的进程描述符仍然会留在系统中。这些子进程就成为僵尸进程。链接:https://leetcode-cn.com/circle/discuss/3xmp7u/来源:力扣(LeetCode)...原创 2021-08-06 14:30:26 · 67 阅读 · 0 评论 -
既然C里有malloc和free,为什么C++还需要new和delete呢?
malloc与free是C、C++语言的标准库函数,new/delete是C++的运算符。他们都用于申请动态内存和释放内存。对于非内部数据类型的对象而言(例如类对象),只用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,也就不能自动执行构造函数和析构函数。因此,不能将执行构造函数和析构函数的任务强加给malloc/free。所以,在c++中需要一个能完成动态内存分配和原创 2021-08-06 14:28:38 · 473 阅读 · 0 评论 -
C里具有struct,为何C++需要增加class?有何区别?
在C中struct只单纯的用作数据的复合类型,也就是说,在结构体声明中只能将数据成员放在里面,而不能将函数放在里面。而在C++中class理论上也是结构体,即也是复合数据类型,但成员不仅限于数据,含可以包含函数成员等。C++是在C语言的基础上,进行了很多功能扩展,其中最重要的一条,就是引入了class。引入class的最大好处就是,使C++可以进行面向对象编程。面向对象编程,简称OOP,具备三个要素:封装性、继承性、多态性。诚然,struct可以实现封装性,但是,struct不能进行继承,更不能进..原创 2021-08-06 14:27:20 · 743 阅读 · 3 评论