自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 const int* a、int* const a、const int* const a的区别

const int* a首先 a 是一个整形指针,而 const 修饰的是 int*,表示 a 所指向的地址的内容不能被改变,但是 a 本身还可以指向别的地址。如图:a 指向 m 的地址,14行企图用 *a 来改变 m 的值就报错了。而15行让 a 再指向 n 的地址则正常。补充:const int* a 与 int const* a效果相同。int* const a同样 a 也是一个指向整形变量的指针,但与 const int* a 不同,const 修饰的是 a 本身,那么效果也就可想而

2021-08-01 21:48:15 1162 1

原创 腾讯实习后端开发一面凉经!

多态?动多态和静多态常量指针和指针常量内存泄漏,除了没free/delete还有什么情况会造成内存泄漏?野指针指的是什么东西?vectorconst作用(超细)如何实现一个栈?用数组和链表实现的区别?口述快排过程I/O多路复用epoll工作模式(LT和ET)进程间通讯方式本地通信的socket?(AF_UNIX)(多)进程和(多)线程的区别和优缺点?多线程同时访问多个全局变量怎么加锁?(所有的全局变量用一个锁怎么做)TCP/UDP区别?三次握手HTTP协议有哪些方法?GET.

2021-07-11 18:12:01 264

原创 静态变量、全局变量和局部变量

1.从作用域看:C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定

2021-07-10 22:46:47 442

原创 Leetcode 86.分隔链表

Leetcode 86.分隔链表题目链接:分隔链表题目描述:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。题目思路:定义两个虚拟头节点,分为为p_max和p_min,从头遍历原始链表,如果当前节点值小于 x ,就将当前节点连接到p_min之后,否则将当前节点连接到p_max之后,这样遍历完成后,就将小于 x 的节点和大于等于 x 的节点分离开了,最后再将大于等于

2021-07-09 11:44:28 96

原创 了解Linux系统环境变量

概念简单来说,环境变量的是用来定义系统运行环境的一些参数。环境变量名称一般都是大写。常见的环境变量HOME:保存用户家目录的环境变量。SHELL:保存当前使用的命令行解释器的名称。PATH:保存可执行程序的路径的环境变量。LD_LIBRARY_PATH:程序运行时,依赖库文件的搜索路径的环境变量。CPLUS_INCLUDE_PATH:可以定义第三方C++头文件所在路径的环境变量。常用命令echo $[环境变量名称]:可以查看某一个环境变量的值(内容)。env:查看当前操作系统中环境

2021-06-23 10:55:16 176

转载 【超详细】事务的ACID以及MySQL的隔离级别

什么是事务首先要明白什么是事务?事务是程序中一系列严密的操作,所有的操作必须完成,否则在所有的操作中所做的所有的更改都会被撤销。也就是事务的原子性,一个事务中的一系列的操作要么全部成功,要么就是失败。事务的结束有两种,当事务中所有的步骤全部成功执行的时候,事务提交。如果其中一个步骤失败,将会发生回滚操作,撤销到事务开始之前的所有的操作。事务的ACID事务具有四个特征原子性 :事务是数据库的逻辑工作单位,事务中包含多个操作,要么都做完,要么都不做。隔离性:事务彼此之间是不能互相干扰的,即一个事

2021-06-06 18:10:15 91

原创 面试问烂了的三握四挥

目录三次握手握手为什么需要三次,两次四次不行吗四次挥手挥手为什么需要四次,三次不行吗三次握手三次握手其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。过程:刚开始客户端处于 CLOSED 的状态,服务端处于 LISTEN 状态,进行三次握手:第一次握手:客户端给服

2021-05-31 23:24:57 156

原创 死锁及其处理方法

目录1.什么是死锁2.死锁的成因3.死锁的必要条件4.死锁的处理方法5.处理死锁的例子1.什么是死锁我们先看一个生活中的例子,有1、2、3、4共四条公路,现在A、B、C、D四辆车驶入成下图的情况。要让A成功向前行驶,就必须先让B通过;而B想要通过,就必须让C先通过;同理C想要通过,就必须先让D通过;D想要通过,就必须让A先通过。最后造成每辆车都想要通过但有必须自己先通过的死循环。我们将上图中的公路看成计算机的资源,将车看成在CPU中运行的进程,就可以得到死锁的概念。我们将这种多个进程由于互相等待对方

2021-05-30 22:48:48 665

原创 守护进程、僵尸进程和孤儿进程

守护进程指在后台运行的,没有控制终端与之相连的进程。它独立于控制终端,周期性地执行某种任务。Linux的大多数服务器就是用守护进程的方式实现的,如web服务器进程http等。创建守护进程要点:让程序在后台执行。方法是调用fork()产生一个子进程,然后使父进程退出。调用setsid()创建一个新对话期。控制终端、登录会话和进程组通常是从父进程继承下来的,守护进程要摆脱它们,不受它们的影响,方法是调用setsid()使进程成为一个会话组长。setsid()调用成功后,进程成为新的会话组长和进程组长,

2021-05-17 11:22:40 161

原创 一个程序从开始运行到结束的完整过程

目录预编译编译汇编链接我们平时不管是在 Windows 下的编译器直接点击执行一个代码,还是在 Linux 下通过 gcc/g++ 生成可执行文件并执行,都会直接出来代码的运行结果。但实际上它还细分为以下四个过程:预编译、编译、汇编、链接。预编译主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下1、删除所有的#define,展开所有的宏定义。2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。3、处理“#include”预编

2021-05-17 11:10:53 3156

原创 Linux进程间通信的几种方式

Linux几乎支持全部UNIX进程间通信方法,包括管道(有名管道和无名管道)、共享内存、消息队列、信号、信号量和套接字。其中套接字是用于不同主机在网络中的通信。管道:无名管道(内存文件):管道是一种半双工的通信方式,数据只能单向流动,也就是在同一时刻只能由管道的一端向另一端发送数据,另一端进行接收。而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常指父子进程或兄弟进程。有名管道(FIFO文件,借助文件系统):有名管道也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用;管道是先进先出的通

2021-04-28 19:13:01 263

原创 C++中const和static的作用

const不考虑类的情况const 常量在定义时必须初始化,之后无法更改。const 形参可以接收 const 和非 const 类型的实参,例如:// i 可以是 int 型或者 const int 型void fun(const int i){ //函数实体 ...} 考虑类的情况const 成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其 const 数据成员的值可以不同,所以不能在类中声明时初始化。const 成员函数

2021-04-12 18:38:59 334

原创 C++ 指针和引用的区别

指针是一个变量,存储的是一个地址;引用跟其原来的变量实质上是一个东西,只是原变量的别名。指针可以有多级;而引用只有一级。指针可以为空;引用不能为空。指针声明和定义可以分开,可以先只声明指针变量而不初始化,等到用时再指向具体变量;而引用在声明时必须初始化为另一变量。指针在初始化后可以重新改变指向;而引用在初始化后不可再改变。sizeof 指针得到的是这个指针的大小;而sizeof 引用得到的是引用所指向的变量的大小。当把指针作为参数进行传递时,想要在外部函数里更改这个指针指向的值就必须传指针的指.

2021-04-12 17:49:28 149

原创 深入浅出TCP协议

TCP协议是网络传输层中最重要的通信协议之一,它是面向字节流、面向连接的、具有可靠性传输的网络传输协议。TCP头部格式源端口和目的端口:接收方在进行数据分用的时候,传输层的tcp协议通过端口,可以将数据提交给指定侦听的应用程序;传输层再通过目的端口来区分数据属于哪一个进程。序号:标识TCP源端向TCP目的端发送的数据字节流。确认号:标识TCP目的端期望TCP源端的下一个请求序号。...

2021-04-07 23:31:39 322 1

原创 HTTP协议

http协议介绍http协议叫超文本传输协议,是因特网上应用最为广泛的一种网络传输协议。http协议是应用层的协议,由http请求和http应答构成。其在传输层使用TCP协议、在网络层使用IP协议。https协议是http协议的加密版本;http默认的端口是80,https默认的端口是443。http协议通信流程一次http工作过程大概如下:用户在浏览器输入一个想要访问的网页的URL。浏览器根据输入的URL中的域名,通过DNS域名解析协议解析出目标IP地址。客户端先通过TCP/IP协议和服务端

2021-03-27 20:32:09 680 8

原创 Leetcode -- 92.反转链表Ⅱ

题目链接:反转链表Ⅱ(区间反转链表)题目描述:给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表 。思路:链表问题一般只要思路清晰,必要时在草稿纸上画图,理清思路,注意边界条件,一般问题就会迎刃而解。反转链表不难,而区间反转链表主要是要找到left位置的前一个节点和后一个节点,可以定义一个哑节点prev,初值赋为-1,并让它指向链表的第一个节点,遍历链表。让pre

2021-03-20 15:15:51 209 1

原创 TCP编程小Demo

封装好的接口#pragma once#include <stdio.h>#include <unistd.h>#include <iostream>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string>#include <stdlib.h>class TcpSer{pu

2021-03-18 23:08:17 255

原创 TCP通信流程及其接口

目录一、TCP通信流程客户端服务端二、TCP编程套接字接口三、示例代码一、TCP通信流程TCP通信流程和UDP通信流程大同小异,由于UDP是无连接的通信协议,而TCP是一种面向连接的通信协议,所以TCP通信流程比UDP多了一个双方发送和获取连接的步骤。客户端创建套接字。绑定地址信息。(操作系统完成)发起连接。发送数据。接收数据。关闭套接字。服务端创建套接字。绑定地址信息。监听。告诉操作系统当前程序可以正常的接收连接了,是内核完成的。三次握手也是内核在监听的时候完成的。获取连

2021-03-17 18:51:39 2312

原创 UDP通信流程及其接口

目录一、UDP通信流程客户端服务端二、UDP编程套接字接口一、UDP通信流程客户端创建一个套接字。绑定地址信息。一般情况下编写客户端程序时不用自己绑定地址信息,会让操作系统默认分配一个空闲的端口。因为一个端口只能被一个进程绑定。发送数据。接收数据。关闭套接字。服务端创建一个套接字。绑定地址信息(port和ip)。port表明服务端进程在哪一个端口上侦听数据;ip表明服务端进程在哪一个机器上接收数据。接收数据。发送数据。关闭套接字。二、UDP编程套接字接口创建套接字

2021-03-17 17:48:09 2573

原创 网络基础概念知识

1.OSI体系结构/参考模型

2021-03-16 21:40:45 157 2

原创 C++STL常用算法的使用

1.accumulate()accumulate() 该算法作用是对区间中的元素进行累加。int main(){ vector<int> v = { 1,2,3,4,5,6,7,8,9,10 }; //普通累加法 int sum = 0; for (const auto& e : v) { sum += e; } cout << "sum = " << sum << endl; //STL累加算法 int sum1 =

2021-03-05 00:08:46 453 1

原创 C++11类型转换

C语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换(强制转换)。隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败显式类型转化:需要用户自己处理void Test{ int a = 10; double b = 12.34; char ch = 'A'; //隐式转换 a = b; // a = 12; a

2021-03-02 21:02:58 148

原创 shared_ptr的循环引用问题

废话不多说,先上代码struct ListNode{ int _data; std::shared_ptr<ListNode> _prev; std::shared_ptr<ListNode> _next; ~ListNode() { cout << "~ListNode()" << endl; }};int main(){ shared_ptr<ListNode> node1(new ListNode); sh

2021-02-26 01:18:17 237

原创 C++11 -- shared_ptr 共享智能指针

shared_ptr 是一个最像指针的“智能指针”,是boost/smart_ptr库中最有价值,最重要的组成部分,也是最有用的。boost库中的许多重要组件,甚至其它领域的智能指针都使用了shared_ptr,比如C++11里的shared_ptr就是参考boost库里的shared_ptr实现的。shared_ptr的原理shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。所以shared_ptr也叫做引用计数型智能指针。shared_ptr在其内部,

2021-02-26 00:40:55 280

原创 进程基本状态

1.进程三大基本状态1.1 进程三种基本状态就绪态当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。运行态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为运行状态。阻塞态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信号等。1.2 进程三种状态间的转换就绪 → 运行处于就绪状态的进程,当进程调度程序为之分配了处理机

2021-02-02 22:30:45 427 1

原创 进程和程序的区别

进程和程序的区别进程是程序的一次动态执行过程。进程是动态的,程序是静态的。进行在CPU上运行生命周期相对短暂,而程序是存储在磁盘上的,生命周期相对永久。进程具有进程控制块(PCB)。一个进程只能对应一个程序,一个程序可以对应多个进程。...

2021-02-02 21:22:08 657 2

原创 C++ - 初识多态

一、什么是多态1.我们知道,面向对象语言都具有抽象、封装、继承、多态这几大特性,当然C++也不例外。2.对于面向对象语言,多态简单来说就是同一接口,产生不同形态。3.实现多态的目的是为了一个方法可以被不同的对象调用,从而达到代码重用。避免重复造轮子。多态分为静多态和动多态1.静多态:在编译的时候就确定了函数的地址,然后call就调用了。2.动多态:首先需要取到对象的首地址,然后再解引用取到虚函数表的首地址后,再加上偏移量才能找到要调的虚函数,然后call调用。二、实现多态的条件1.

2021-01-28 20:14:56 133

原创 C++ 菱形继承与虚拟继承

文章目录1. 什么是菱形继承?2. 菱形继承的问题是什么?3.如何解决菱形继承的问题4.虚拟继承解决菱形继承问题的原理1. 什么是菱形继承?单继承:一个子类只有一个直接父类时称这个继承关系为单继承多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承菱形继承:菱形继承是C++ 多继承的一种表现形式用一张简单的图就可以说明什么是菱形继承2. 菱形继承的问题是什么?继承最简单的理解就是子类将父类中的成员拷贝了一份。我们用最简单的四个类A,B,C,D有且仅有一个成员变量分别是 m_

2021-01-19 23:02:16 142 2

原创 C++ 零初始化

零初始化零初始化也叫零构造。在学习C++或者其他语言中,初始化这一概念会贯穿整个学习过程,初始化顾名思义就是为一个变量或对象赋予一个初值,防止在后面使用时访问到随机值。这里要说的是在C++使用类模板时如何为成员变量初始化。先看下面一个例子:template<class Type>class ListNode{public: ListNode(Type d = 0) : data(d), next(nullptr) {}private: Type data;.

2020-12-20 16:26:28 1009

原创 C++ STL 之 string的模拟实现

STL 之 string的模拟实现#include <iostream>#include <cassert>using namespace std;//STL里string的模拟实现namespace my_string{ class string { typedef char* iterator; //声明迭代器 static size_t npos; //无符号的-1 friend ostream& operator<<(o

2020-12-19 14:27:45 120 1

原创 C++ STL 之 list容器的模拟实现

list容器的模拟实现#include <iostream>using namespace std;namespace mylist //防止跟系统冲突,使用自己的命名空间{ template<class T> class list; //前向声明 template<class T> class ListIterator; template<class T> class ListNode //声明节点类型 { friend c

2020-12-16 19:19:49 127

原创 C++ new/delete 和malloc/free的区别

new/delete 和malloc/free的区别new/delete 和 malloc/free 的共同的是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:malloc 和 free 是函数,new 和 delete 是操作符。malloc 申请的空间不会初始化,new 可以初始化。malloc 申请空间时,需要手动计算要申请的空间的大小并传递,new 只需要在其后面跟上空间的类型即可。malloc的返回值为 void *,在使用时必须强转成想要的类型,new 不需要,因为 new

2020-12-02 23:10:50 127

原创 C++ 内存管理new和operator new

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2020-12-02 22:50:49 133

原创 C++ -- 类的6个默认成员函数

类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。1.构造函数1.1 概念构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。2.1 特性构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任务并不是开空间创建对象,而是初始化对象。其特征如下:

2020-11-29 15:03:30 94

原创 C++ --初识类和对象

1.面向过程和面向对象的初步认识1.C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。2.C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2.类的定义C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。类的定义class Person{ // 类体:由成员函数和成员变量组成public: //显示人的基本信息 void Show() { std::cout <&lt

2020-11-29 13:30:01 222 1

原创 C语言八大排序算法【详细 代码+图文】

C语言八大排序算法辅助方法代码void ShowArr(int* arr, int len) //显示数组{ for (int i = 0; i < len; ++i) { printf("%d ", arr[i]); } printf("\n");}bool IsSort(int* arr, int len) //判断数据是否有序,从小到大{ for (int i = 0; i < len - 1; ++i) { if (arr[i] > arr[

2020-11-22 20:05:59 8349

原创 C++函数重载

C++函数重载学习过C++的朋友都知道C++支持函数的重载,什么叫重载呢,就是我们写代码时有时会用两个相同名字的函数,编译器在编译时会根据不同的情况调用不同的函数。而这种情况在C语言中是不允许的,但是在C++里面是可以的。这里我们简单了解一下。C++函数重载必须要满足的条件是:1.函数名相同。2.参数列表相同。1.C++函数能够重载它的底层是怎么实现的呢?我们来看一段很简单的代码:#include <iostream>using namespace std;int Max(i

2020-11-11 18:02:24 1242

原创 C++ virtual 关键字

C++ virtual 关键字C++中,virtual 关键字修饰的函数称为虚函数。我们知道,C++ 语法中有三大特征,封装、继承、多态。这里我们重点说一下多态,多态简单理解为同一接口,不同形态,具体讲就是接口相同,函数名相同,传入的参数不同,调用的函数不同,产生的形态不同。多态一般分为3类:1.静多态,在编译阶段确定函数调用2.动多态,在运行阶段确定函数调用3.宏多态,在预编译阶段...

2020-02-04 23:42:45 211

原创 利用泛型编程实现冒泡排序

泛型编程:顾名思义即为一种通用通泛的算法,它可以实现不特定数据类型的问题,通俗来讲就是一函多用下面我们用一个泛型冒泡举例

2019-05-26 20:42:38 484

原创 char *str 和 char str[] 的区别

相同点:都是定义一个字符串不同点:1.含义上的区别char str[] 是定义一个字符串数组,数组对应的是一块内存区域,而char *str 是定义一个指向字符串的指针,即指向一块内存区域。数组的内存大小和其地址在作用域里是固定不变的,只有它存储的内容可以改变;而指针却不同,它指向的内存区域的大小随时可以改变,而且当指针指向常量字符串时,它指向的内容是不可以被修改的,否则在运行时会报错。...

2019-04-20 16:44:52 10169

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除