- 博客(85)
- 收藏
- 关注
原创 【C++】总结static关键字的作用
1、全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。会被存放在静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);作用域:作用域改变,为当前文件中。2、局部静态变量在局部变量之前加上关键字static,局部变量就成为了一个局部静态变量。存放在静态存储区。初始...
2019-10-07 18:31:06
386
原创 【网络】在浏览器地址栏输入一个url,按下回车之后会发生什么?用到哪些协议?用到哪些层?
在浏览器地址栏键入URL,按下回车之后会经历哪些流程?1、DNS解析,得到IP地址;DNS是什么?DNS是一种组织成域层次结构的计算机和网络服务命名系统,用于TCP/IP网络,所提供的服务是用来将主机名和域名转换成IP地址的工作。DNS解析过程:主机查询DNS缓存,如果没有就会给本地DNS发送查询请求; 本地的DNS服务器向根域名服务器发送查询请求,根域名服务器返回该域名的一...
2019-10-06 12:12:52
2081
原创 图片服务器项目浅析
1、项目背景类似于在csdn中上传图片一样,我们选择了图片上传后,会进入选择图片文件的界面,然后上传成功后,我们就可以看到上传的图片被展示出来,其实我们是将图片上传到了csdn的后台服务器中,而我们要实现的就是具备这样功能的一个图片服务器,可以提供对图片的增删查改操作。2、核心功能该项目的核心就是实现一个HTTP服务器,然后用这个服务器来存储图片,针对每一个图片提供一个唯一的...
2019-09-18 17:00:42
429
原创 小型收银台项目浅析
目录1、项目背景2、核心功能3、数据库设计4、接口5、项目中遇到的问题6、扩展1、项目背景众所周知,收银台即各个商铺结算付款的地方,客户在此处完成结款并获得购物票据,也可以通过这个系统快速的查出顾客结账情况、商品信息、售货情况等,这也就是传统收银台的最主要功能。但与此同时,传统收银台也存在一些缺陷,比如:收款结算速度慢、易出差错、不宜进行商品调价、商品盘点效率低、用...
2019-09-03 15:03:38
635
原创 【C++】shared_ptr的线程安全及循环引用问题
std::shared_ptr的线程安全问题shared_ptr的线程安全分为两方面:智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计数同时++或--,这个操作不是原子的,引用计数原来是1,++了两次,可能还是2,这样引用计数就错乱了。会导致资源未释放或者程序崩溃的问题。所以智能指针中引用计数++、--是需要加锁的,也就是说引用计数的操作是线程安全的。 智能指针...
2019-08-27 12:04:17
854
原创 【C++】智能指针
内容:为什么需要智能指针? 几种智能指针的使用及原理1、为什么需要智能指针?malloc,或者new出来的空间没有进行释放,存在内存泄漏的问题; 异常安全问题。如果在malloc和free之间(或者new与delete)存在抛异常,那么内存泄漏还是会发生,这种问题就叫做异常安全。2、智能指针的使用及原理2.1 RAIIRAII是一种利用对象生命周期来控制程序资源(如内存、文...
2019-08-27 11:31:14
285
原创 【C++】mkdir
题目描述:工作中,每当要部署一台新机器的时候,就意味着有一堆目录需要创建。例如要创建目录“/usr/local/bin”,就需要此次创建“/usr”、“/usr/local”以及“/usr/local/bin”。好在,Linux下mkdir提供了强大的“-p”选项,只要一条命令“mkdir -p /usr/local/bin”就能自动创建需要的上级目录。现在给你一些需要创建的文件夹目录,请...
2019-08-13 11:33:16
6087
原创 【C++】菱形继承及菱形虚拟继承
什么是菱形继承?首先,我们看一下单继承,以及多继承是什么?单继承:一个子类只有一个直接父类时称这个继承关系为单继承多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承菱形继承:菱形继承是多继承的一种特殊情况菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。虚拟继承...
2019-07-31 17:47:07
291
原创 【C++】实现一个不能被继承的类
【常见面试题】实现一个不能被继承的类思路:如何让一个类不能被继承?我们知道如果一个类被继承,派生类要生成其类对象,就需要调用其构造函数,而派生类的构造函数必须调用基类的构造函数基类的构造函数初始化基类的那一部分成员。那如果我们将一个类的构造函数给成私有的呢? 给成私有限定后,确实不能被继承了,可是这个类本身也不能创建对象了。 把构造函数设为private限定类型,在类中定义一个静态函数...
2019-07-23 16:36:37
302
原创 【C++】继承定义及基类与派生类对象赋值转换
1.继承概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。具体定义格式如下:继承关系与访问限定符有:继承方式:public继承、protected继承、privat...
2019-07-23 16:21:09
740
原创 【Linux】线程概念及线程控制
1、进程与线程什么是线程?在一个程序里的一个执行路线就叫做线程,即线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程 线程在进程内部运行,本质是在进程地址空间内运行 在Linux系统中,在cpu眼中,看到的pcb都要比传统的进程更加轻量化 线程是一个执行流,用来运行代码,处理数据。线程概念:先说进程:在传统操作系统中使用pcb来描述一个程序的运行---pcb就是进...
2019-07-15 16:33:38
188
原创 【C++】深拷贝以及string类的其传统版与现代版写法
浅拷贝:浅拷贝,也称为拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,还是按照正常的状态来处理,所以当继续对资源项操作时,就会发生访问违规。要解决浅拷贝问题,C++中引入了深拷贝。深拷贝:如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显...
2019-07-08 17:18:13
203
原创 【Linux】信号相关知识点整理
信号概念是一个软件中断,通知进程发生了某件事情,中断进程当前操作,让进程去处理这个事件。信号有很多种:62种信号,两大类型:可靠信号:34~64/非可靠信号:1~31.进程必须识别这些信号。查看信号种类:kill -lkill杀死进程的原理:向进程发送信号--通知事件,让进程自己退出信号生命周期:信号的产生--->在进程中注册--->在进程中注销--->...
2019-06-24 14:04:30
259
原创 【Linux】进程间通信的几种方式总结
介绍与总结以下几种进程间通信方式:管道:匿名管道 命名管道System V进程间通信共享内存 消息队列 信号量管道:半双工通信(可选方向的单向传输)。本质是内核中的一块缓冲区。实现进程间通信的原理:让多个进程通过访问到相同的缓冲区来实现通信。管道实现通信使用的是系统调用的IO接口(这也遵循了一切皆文件的思想)。1、匿名管道及代码实现匿名管道只能用于具有亲缘...
2019-06-21 17:26:26
1049
原创 【C++】类与对象知识点整理
1、类的6个默认成员函数空类:如果一个类中什么成员都没有,形如下面这样,我们就称其为空类。class Date { };那空类中什么都没有吗?并不是,任何一个类,在我们不写内容的情况下都会自动生成6个默认成员函数。2、构造函数1、概念构造函数是一个特殊的成员函数,名字和类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命...
2019-06-17 21:14:58
415
原创 【C++】入门知识点整理
1、C++关键字在C++98中,有63个关键字。(注意不能遗漏标准名称,任何不带标准名称来说关键字个数都是耍流氓。。)2、命名空间1、定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。普通的命名空间 命名空间嵌套 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个空间。注意:一个命名空间就定义了...
2019-06-12 11:49:29
430
原创 【Linux】编写add/sub/mul/div函数,并打包成动、静态库,分别使用
动态库与静态库的生成与使用:库文件实际上就是封装了一大堆已经编译完成的代码文件,通过链接这个库进而获取到相应函数实现。库的生成:编写函数:我们的目标是要将add/sub/mul/div函数打包成动态、静态库,并使用,首先我们先编写这四个函数,分别命名为child1.c、child2.c、child3.c以及child4.c,函数具体如下:然后编写相应的.h文件,完成后...
2019-06-11 10:50:17
690
原创 【Linux】fd与FILE结构体
【问题描述】:练习open/read/write/close等文件相关系统调用接口,纵向对比fd与FILE结构体标准库中的IO接口:fopen(path, mode(" r:只读 r+:可读可写 w:只写,文件不存在时创建,写入时会发生截断 w+:可读可写 a:追加写 a+:可读可写"))、fwrite/fread、fseek、fclose ...
2019-06-10 15:17:04
306
原创 【Linux】实现一个minishell
完成一个minishell,其中可以实现简单的命令解释,以及重定向符号功能。首先实现命令解释的思路:获取用户输入内容 解析获取到的内容,得到命令及其参数 创建子进程 程序替换shell中处理外部命令是通过创建子进程后程序替换完成功能,还有一部分命令是内建命令,也就是shell自身实现的功能,比如cd。重定向实现思路:解析字符串,重定向符号前是命令及参数,后面是文件名称 ...
2019-06-05 21:45:02
979
原创 【Linux】popen与system函数
首先我们来看一下popen函数:用man命令来查看popen会看到这样的介绍:Name:popen,pclose--pipe stream to or from a processSynopsis:#include <stdio.h>FILE* popen(const char * command,const char * type);int pclose(FI...
2019-06-05 18:45:57
397
原创 【Linux】进程的创建、等待与终止
进程创建使用fork函数来创建进程,它可以从已存在的进程中创建一个新进程,新进程为子进程,原进程为父进程。进程调用fork,当控制转移到内核中的fork代码后,内核:分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表中 fork返回,开始调度器调度进程创建的代码:运行结果:可以从结果看出新产生了一个pid为406...
2019-06-05 16:32:52
370
原创 【Linux】僵尸进程与孤儿进程
1、僵尸进程什么是僵尸进程?处于僵死状态的进程-----(危害)会造成资源泄漏僵尸进程的产生原因:子进程先于父进程退出,因为要保留退出原因,因此操作系统不能直接释放所有资源,通知父进程获取退出原因,允许操作系统释放资源,但是父进程没有关注这个通知导致子进程退出后无法释放所有资源,处于僵死状态成为僵尸进程。如何避免:进程等待出现了僵尸进程如何处理:结束掉父进程,僵尸进程也就结束了...
2019-05-29 19:21:45
225
原创 【Linux】常见的几种进程调度算法
什么是进程调度?为什么要进行进程调度?操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则来选择进程(请求)来占用资源。这就是调度。目的是控制资源使用者的数量,选取资源使用者许可来占用资源。调度算法要求:高资源利用率、高吞吐量、用户满意等原则。进程调度所采用的算法是与整个系统的设计目标相一致的:1).批处理系统:增...
2019-05-28 11:21:32
2550
原创 【数据结构】二叉树链接结构基本操作
二叉树顺序存储的优缺点:顺序存储结构就是使用数组来存储,顺序结构操作比较简单,对于堆结构来说,适合使用顺序存储方式来解决。但数组只适合表示完全二叉树,对于一般的二叉树如果采用顺序存储方式会造成大量的空间浪费,这是我们不希望看到的。由此引出来二叉树的链式存储。并实现二叉树的以下操作:创建二叉树、拷贝二叉树、销毁二叉树、二叉树遍历(前序、中序、后续、层序)、获取二叉树中节点个数、获取二叉树...
2019-05-25 19:45:51
1055
原创 【数据结构】堆应用之TopK问题
【问题描述】:在堆的应用上,大致有这么两类问题:堆排序、topK。堆排序的问题之前讨论过了,现在说说TopK的问题,所谓topK即求一组元素中最大或最小的前K个元素。【解题思路】:如何求topK?将这一组元素排序。 用堆的方式解决。当这组数据大到一定程度时,如果先对这组数据进行排序,恐怕将他们全部加载到内存中都很难实现,在这里我们主要看看如何用堆来解决topK的问题。假定这组元...
2019-05-25 16:50:20
325
原创 【数据结构】堆排序问题及其时间复杂度
【问题描述】:关于排序的问题,我们之前见过冒泡排序,其时间复杂度为O(N^2),效率很低,那有没有高效一点的排序方法?我们就要说到堆排序了,本博客中主要讨论堆排序的实现,以及其时间复杂度分析。【解题思路】:我们知道如果一个二叉树满足堆的特性,那么堆顶元素则一定是整个堆中最大或最小的元素(这取决于大堆或小堆),那如果我们需要将一组数据进行升序排序,那么我们将这组元素拿来创建一个大堆,堆顶元素为整...
2019-05-24 18:12:34
1111
原创 【数据结构】实现可控创建大堆或小堆
【问题描述】:前面我们实现了一个小堆的创建,及一些接口,但在实际应用中,我们并不清楚用户到底是要创建大堆还是小堆,这就要求我们的代码能够根据用户实际需要处理问题,而不是固定的只能处理单一问题。【解决思路】:我们知道创建大堆与小堆的区别在于比较堆中左右孩子时、比较孩子节点与双亲节点时,大堆取较大者,而小堆取较小者,然后继续后面的工作。我们可以创建一个函数指针变量,保存用户传递的比较堆中元素的方法...
2019-05-23 11:02:26
172
原创 【数据结构】堆的概念及接口实现
1、堆的概念及特性如果有一个关键码的集合K={k0,k1,k2,...,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki<=K2i+1且Ki<=K2i+2(Ki>=K2i+1且Ki<=K2i+2)i=0,1,2...,则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。堆的性质:堆中某...
2019-05-22 22:29:44
310
原创 【数据结构】树相关知识点整理
1、树的基本概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的。特点:每个结点有零个或多个子结点; 没有父结点的结点称为根结点; 每一个非根结点有且只有一个父结点; 除了根结点外,每个子结点可以分为多个不相交的子树。2、树的相关概念下图为一个树,其中:节...
2019-05-21 21:10:47
1611
原创 【Linux】在Linux下实现进度条程序
【问题】在Linux下实现一个进度条程序,通过makefile进行编译。首先,我们需要知道进度条是怎么实现的?进度条的动态效果是利用人眼的视觉暂留做到的。比如说:先输出: “= ”表示1%在下一次则显示:“== ...
2019-05-21 17:01:35
488
原创 【Linux】软件安装的几种方式(源码安装、RPM安装及yum安装)
源码安装直接以原始码透过编译来安装与升级; 直接以编译好的binary program来安装与升级。上面第一点很简单,就是直接以Tarball在自己的机器上进行侦测、编译、安装与设定等等动作来升级就是了,较麻烦。一个软件的Tarball是如何安装的?基本流程如下:将Tarball由厂商的网页下载下来; 将Tarball解开,产生很多的原始码档案; 开始以gcc进行原始码的编译(...
2019-05-18 17:44:31
464
原创 【Linux】除了gcc,还有哪些常用的编译器
编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)。下面介绍一下GCC、Clang、Visual S...
2019-05-18 15:48:54
4525
原创 【Linux】除了vim,还有哪些常用的编辑器
Linux下常用的文本编辑器有:vim、emacs、pico、nano、joe,他们各自有什么优缺点,他们之间又有哪些区别呢?下面我们来看看。Vim在所有的Linux distributions 上都会有的一套文本编辑器就是vi,而vim是vi最受欢迎的变种之一,除了继承了vi迅捷的编辑方式,vim的功能已经比原始的vi强大了太多。这也得益于它可以用vim基本无限的扩展。vim.org上已...
2019-05-18 13:38:37
6359
原创 【数据结构】用C语言实现一个队列
1、什么是队列?队列有什么特性?只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列具有先进先出FIFO(First in First Out)。入队列:进行插入操作的一端称为队尾。出队列:进行删除操作的一端称为队头。2、栈和队列有什么区别?队列先进先出,例如排队。栈后进先出。 对插入和删除操作的“限定”不同。栈只能在一端进行数据的插入和删除。而队列是在一...
2019-05-15 17:51:27
2560
原创 【数据结构】用栈来将递归转换成循环
为什么将递归转换成循环需要用到栈?递归其实是在每次调用自己来进入新的状态,直到最后一次的状态能够满足递归的结束条件,然后返回到上次的状态。我们都知道栈有着后进先出的特性,那这样是不是就可以理解为递归每调用一层就压入栈,直到最后满足递归结束条件,再一层层弹出栈,那么用栈来将递归改为循环,就可以理解了。下面我们看一个例子,逆序打印链表:递归实现:void ReversePrint(N...
2019-05-15 16:30:52
496
原创 【数据结构】用C语言实现一个动态栈
1、什么是栈?栈有什么特性?栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵守后进先出LIFO(last in first out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。2、栈的实现栈的实现一般可以用数组或者链表实现,相对而...
2019-05-14 20:59:24
344
原创 【Linux】如何使用命令安装gcc/g++, gdb, vim
1、安装gcc/g++查找。通过yum list命令可以罗列出当前一共有哪些软件包,由于包的数量可能非常多,这里我们需要使用grep命令筛选出我们需要的包。 yum list | grep lrzsz安装。通过yum,使用一条命令完成gcc的安装。sudo yum install lrzsz卸载软件。也可以通过一条命令来删除软件。sudo yum remove lrzsz...
2019-05-11 18:05:32
514
原创 【Linux】了解以下重要命令:du, df, top, free, pstack, su, sudo(sudo -, sudo -s), adduser, password
刚开始进入Linux部分的学习,在认识了一些基础的指令后,针对Linux中一些重要命令,初步查阅资料学习:1、df和dudf功能:列出文件系统的整体磁盘使用量。格式:df [-ahikHTm] [目录或文件名]选项与参数:-a:列出所有的文件系统,包括系统特有的/proc等文件系统;-k:以KBytes的容量显示各文件系统;-m:以MBytes的容量显示各文件系统;-h:以人们较...
2019-05-11 17:00:44
295
原创 【Linux】Linux下目录权限与部分重要目录了解
1、进入目录需要哪些权限, 在目录中执行增删查(cd, touch, ls, rm, mv等)改文件动作, 需要哪些权限?Linux中的多人多任务环境是其最优秀的地方之一,为了保证各个使用者具有较保密的文件数据,在Linux中权限管理就尤为重要了。Linux一般将档案可存取的身份分为三个类别,分别是owner/group/others,即使用者/群组/其他人。且这三种身份各有r/w/x等权限,代...
2019-05-08 17:29:06
216
原创 【C语言】链表及单链表基本操作
1、什么是链表?链表的分类?链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。数据结构中:2、链表的分类共有8种链表结构...
2019-04-29 15:20:45
121270
7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人