自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Lyajpunov的博客

记录自己的所学

  • 博客(292)
  • 资源 (4)
  • 收藏
  • 关注

原创 C++内存泄露检测-Windows平台VLD

我们复制出来的vld文件,CmakeLists.txt,以及我们的程序main.cpp。第二部分是函数调用栈,可以看到在我们的代码中发生泄露的地址是main()+0xA的地址。第二部分是函数调用栈,可以看到在我们的代码中发生泄露的地址是main()+0xA的地址。安装过程就一路next即可,如果自定义安装目录的话,需要记住安装的目录,默认目录。然后我们在相同的文件路劲下创建build文件夹,用来存放编译过程的中间文件。第三部分是发生泄漏的内存的值,现在全部被覆盖为CD。,这个目录下的三个文件夹。

2024-08-14 17:11:27 385

原创 C++哪些变量在没有显式初始化的情况下会被初始化为0

首先,我们需要明白C++程序编译链接后会包含以下几个主要段(Section)。.text.data.bss.rodata.dynamic.plt.got.symtab.strtab从上述的编译后分段就可以看出来,只有BSS段的内容会被自动初始化为0,那么C++中的哪些数据会再编译链接后放入BSS段呢?就是全局变量和静态变量。

2024-08-14 09:57:33 243

原创 Dijistra算法以及flody算法详解及代码注释

迪杰斯特拉算法与弗洛伊达算法

2024-07-12 16:23:39 937

原创 为什么父类的析构函数要定义为虚函数

在C++中,通过基类指针或引用访问派生类对象时,如果基类的析构函数不是虚函数,那么在删除基类指针时,只会调用基类的析构函数,而不会调用派生类的析构函数。这可能导致派生类中特有的资源没有被正确释放,从而引发资源泄露。

2024-07-12 14:22:12 331

原创 容器是线程不安全的,如果多线程下不加锁直接使用容器会发什么

这种情况下,容器的内部状态可能会被破坏,从而导致未定义行为。例如,容器的内部指针或迭代器被破坏,导致非法内存访问,从而引发段错误(Segmentation Fault)。由于多线程竞争条件的不可预测性,程序可能表现出随机性错误。某些情况下,错误可能不会立即显现,但在特定条件下可能会触发。中添加元素时,如果没有适当的同步,可能会导致内部数组的重新分配和指针失效。容器的内部数据结构可能会被多个线程同时修改,从而导致数据不一致。可以看到这里是引发了访问冲突,其实这种行为即使是重复也会出现不一样的结果。

2024-07-12 14:02:49 298

原创 delete删除new[]创建的数组会发生什么

举个例子class Tpublic:int main()delete p2;return 0;这段代码只会执行数组中第一个对象的析构函数,后面的对象就会有发生内存泄露的风险。比如后面的对象申请了一块内存,此时这块内存就再也收不回来了。运行一下,会报warning。

2024-07-12 13:38:10 487

原创 栈模拟二叉树的前序遍历,中序遍历,后序遍历

分别讲述了使用递归方式和栈模拟方式进行二叉树遍历

2024-05-29 16:57:33 1029

原创 C++ 中多态的实现原理-虚函数表详解

编译时多态(Compile-time Polymorphism):也称为静态多态性,是在编译时确定的多态性。C++中的函数重载和模板(Templates)是编译时多态的例子。函数重载允许定义多个同名函数,但它们的参数列表不同,编译器根据参数类型或个数来决定调用哪个函数。模板允许编写通用的代码,以适用于不同类型的数据。运行时多态(Run-time Polymorphism):也称为动态多态性,是在运行时确定的多态性。C++中的虚函数和继承是运行时多态的例子。

2024-05-16 18:50:49 1121

原创 C++ 中重写重载和隐藏的区别

重写(override)、重载(overload)和隐藏(overwrite)在C++中是3个完全不同的概念

2024-05-15 17:48:36 573

原创 C++11 新特性 常量表达式 constexpr

为了解决常量无法确定的问题,C++11在新标准中提出了关键字constexpr,它能够有效地定义常量表达式,并且达到类型安全、可移植、方便库和嵌入式系统开发的目的。

2024-05-15 17:47:44 457

原创 C++11新特性 列表初始化

列表初始化解决了以往标准容器初始化十分不方便的问题,使用列表初始化可以让容器如同数组一般被初始化。

2024-05-13 20:55:40 935

原创 C++17新特性 结构化绑定

结构化绑定是C++17提出的新特性,可以类似python中那样,直接返回元组,绑定到变量上

2024-05-13 20:10:23 1177

原创 C++11新特性 lambda表达式

lambda表达式是现代编程语言的一个基础特性,比如LISP、Python、C#等具备该特性。而C++在C++11标准才正式支持lambda表达式。

2024-05-12 21:20:11 749

原创 C++11 新特性 decltype 说明符

decltype是在C++11中新出现的一个操作,用来简化和统一typeof和typeid操作

2024-05-12 21:19:19 451

原创 C++11新特性 右值引用详解

C++引入右值引用以及与之相关的移动语义和完美转发,C++的语义变得更加丰富和合理,与此同时它的性能也有了更大的优化空间。对于这些优化空间,C++委员会已经对标准库进行了优化,比如常用的容器均已支持移动构造函数和移动赋值运算符函数。

2024-05-11 15:50:01 773

原创 C++指针常量和常量指针的区别

常量指针是定义了一个指针,这个指针指向一个对象,不能通过常量指针来修改这个对象。指针常量是指定义了⼀个指针,这个指针的值只能在定义时初始化,其他地⽅不能改变。

2024-05-11 15:48:16 266

原创 Linux中的日志系统简介

在的Linux系统上使用的日志系统一般为rsyslogd。rsyslogd守护进程既能接收用户进程输出的日志,又能接收内核日志。

2024-05-10 10:04:34 939

原创 Linux网络编程(五) 定时器

定时是指在一段时间之后触发某段代码的机制,我们可以在这段代码中依次处理所有到期的定时器。

2024-05-10 10:03:53 940

原创 Linux网络编程(四) 同时处理一个端口的UDP与TCP连接

服务器如果要同时监听多个端口,就必须创建多个socket,并将它们分别绑定到各个端口上

2024-05-09 13:30:10 269

原创 Linux网络编程(三)IO复用三 epoll系统调用

epoll是Linux特有的I/O复用函数。它在实现和使用上与poll有很大差异。

2024-05-09 13:29:29 1166

原创 Linux网络编程(三)IO复用二 poll系统调用

GNU为poll系统调用增加了一个POLLRDHUP事件,它在socket上接收到对方关闭连接的请求之后触发。poll系统调用的返回值,成功时返回就绪(可读、可写和异常)文件描述符的总数,如果在超时时间内没有任何文件描述符就绪,select将返回0。由XOPEN规范定义。fds参数是一个pollfd结构类型的数组,它指定所有我们感兴趣的文件描述符上发生的可读、可写和异常等事件。成员告诉poll监听fd上的哪些事件,它是一系列事件的按位或;

2024-05-08 09:43:44 846

原创 Linux网络编程(三)IO复用一 select系统调用

I/O复用使得程序能同时监听多个文件描述符。需要指出的是,I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这使得服务器程序看起来像是串行工作的。如果要实现并发,只能使用多进程或多线程等编程手段。

2024-05-08 09:42:46 1120

原创 Linux网络编程(二) socket编程及其仿真

本节内容介绍Linux下进行网络编程所必须得socket接口的一些知识。

2024-05-07 15:08:02 925 1

原创 Linux网络编程(一) 网络基础

向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务。UDP则不同,UDP是不可靠的服务,当一个UDP数据报被成功发送之后,UDP内核缓冲区中的该数据报就被丢弃了。其工作原理是:主机保存了一份IP地址和MAC地址的映射高速缓存,先从表中查询,查询不到的话,主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终将处理后的帧交给目标应用程序。

2024-05-07 14:55:42 1525

原创 Linux多线程(三) 线程池C++实现

我们使用线程的时候就去创建一个线程,这样实现起来非常简便。但如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池就是为了让线程可以复用,不在线程的创建和销毁上浪费时间。线程池主要分为三个部分任务就是函数与参数组成的结构体。

2024-04-27 19:38:06 511 1

原创 Linux多线程(二) 线程同步 信号量&互斥锁&读写锁&条件变量

多个进程同时访问某些资源时,必须考虑同步问题,以确保任一时刻只有一个进程可以拥有对资源的独占式访问。通常,程序对关键资源的访问代码只是很短的一段,我们称这段代码为关键代码段或者临界区,对进程同步,也就是确保任意时刻只能有一个进程进入关键代码段。

2024-04-27 19:36:40 993

原创 Linux多线程(一) 线程的创建与控制

线程是轻量级的进程(LWP:light weight process),在Linux环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系统资源,可以这样理解,进程是资源分配的最小单位,线程是操作系统调度执行的最小单位。进程有自己独立的地址空间, 多个线程共用同一个地址空间线程更加节省系统资源, 效率不仅可以保持的, 而且能够更高在一个地址空间中多个线程独享: 每个线程都有属于自己的栈区, 寄存器(内核中管理的)

2024-04-27 19:35:10 934

原创 Linux多进程(五) 进程池 C++实现

进程池是一种并发编程模式,用于管理和重用多个处理任务的进程。它通常用于需要频繁创建和销毁进程的情况,以避免因此产生的开销。减少进程创建销毁的开销:避免频繁创建和销毁进程所带来的系统资源开销。提高系统响应速度:由于进程已经初始化并且一直保持在内存中,可以立即分配执行任务,减少了任务等待时间。控制资源使用:通过限制进程池中的进程数量,可以控制系统资源的使用情况,避免资源过度消耗。

2024-04-26 16:31:32 1085 1

原创 Linux多进程(四) 守护进程

守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。

2024-04-26 16:29:38 567

原创 Linux多进程(三) 信号&信号集与统一事件源

信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。

2024-04-25 14:57:33 1040 1

原创 Linux多进程(二)进程通信方式三 共享内存

共享内存提供了一个在多个进程间共享数据的方式,它们可以直接访问同一块内存区域,因此比使用管道或消息队列等通信机制更高效。在多进程程序中,共享内存通常与信号量一起使用,以确保对共享内存的访问是线程安全的。

2024-04-25 14:47:30 1074

原创 Linux多进程(二)进程通信方式二 消息队列

消息队列是在两个进程之间传递二进制块数据的一种简单有效的方式。每个数据块都有一个特定的类型,接收方可以根据类型来有选择地接收数据,而不一定像管道和命名管道那样必须以先进先出的方式接收数据。

2024-04-24 12:48:40 1509 1

原创 Linux多进程(二)进程通信方式一 管道

管道的是进程间通信(IPC - InterProcess Communication)的一种方式,管道的本质其实就是内核中的一块内存(或者叫内核缓冲区),这块缓冲区中的数据存储在一个环形队列中,因为管道在内核里边,因此我们不能直接对其进行任何操作。

2024-04-24 12:43:08 1498

原创 Linux多进程(一)创建进程与进程控制

在子进程退出的时候, 进程中的用户区可以自己释放, 但是进程内核区的pcb资源自己无法释放,必须要由父进程来释放子进程的pcb资源,孤儿进程被领养之后,这件事儿干爹就可以代劳了,这样可以避免系统资源的浪费。在一个启动的进程中创建子进程,这时候就有了父子两个进程,父进程正常运行, 子进程先与父进程结束, 子进程无法释放自己的PCB资源, 需要父进程来做这个件事儿, 但是如果父进程也不管, 这时候子进程就变成了僵尸进程。消灭僵尸进程的方法是,杀死这个僵尸进程的父进程,这样僵尸进程的资源就被系统回收了。

2024-04-23 14:17:08 594

原创 Linux中的高级IO函数(三)fcntl

Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read)那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性能。这些函数大致分为三类:用于创建文件描述符的函数,包括pipe、socketpair、dup/dup2函数。用于读写数据的函数,包括readv/writev、sendfile、mmap/munmap、splice和tee函数。用于控制I/O行为和属性的函数,包括fcntl函数。本节接着介绍第三类。

2024-04-23 14:14:41 442

原创 Linux中的高级IO函数(二)readv & writev & sendfile & mmap & splice & tee

Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read)那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性能。这些函数大致分为三类:用于创建文件描述符的函数,包括pipe、socketpair、dup/dup2函数。用于读写数据的函数,包括readv/writev、sendfile、mmap/munmap、splice和tee函数。用于控制I/O行为和属性的函数,包括fcntl函数。本节接着介绍第二类。

2024-04-22 19:48:22 1082

原创 Linux中的高级IO函数(一)pipe & socketpair & dup

Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read)那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性能。这些函数大致分为三类:用于创建文件描述符的函数,包括pipe、socketpair、dup/dup2函数。用于读写数据的函数,包括readv/writev、sendfile、mmap/munmap、splice和tee函数。用于控制I/O行为和属性的函数,包括fcntl函数。本节先介绍第一类。

2024-04-22 11:06:30 850

原创 十大经典排序算法及其C语言实现--带动图展示

排序算法大概算起来有以下十种。

2024-04-11 13:05:47 1035

原创 手写简易操作系统(二十八)--实现简单shell

在Linux中,“Ctrl+u”的作用是清除输入,也就是在回车前,按下“Ctrl+u”可以清掉本次的输入,相当于连续按下退格键的效果。外部命令是指该命令是个存储在文件系统上的外部程序,执行该命令实际上是从文件系统上加载该程序到内存后运行的过程,也就是说外部命令会以进程的方式执行。大伙儿应该最为熟悉ls命令,它就是典型的外部命令,它通常的存储路径是/bin/ls。内部命令也称为内建命令,是系统本身提供的功能,它们并不以单独的程序文件存在,只是一些单独的功能函数,系统执行这些命令实际上是在调用这些函数。

2024-04-10 13:52:28 563

原创 手写简易操作系统(二十七)--实现fork

fork函数原型是,返回值是数字,该数字有可能是子进程的pid,有可能是0,也有可能是−1。为了让父进程获知自己的孩子是谁,fork会给父进程返回子进程的pid。子进程可以通过系统调用getppid获知自己的父亲是谁,并且没有pid为0的进程,因此fork给子进程返回0,以从返回值上和父进程区分开来。如果fork失败了,返回的数字便是−1,自然也没有子进程产生。让我们看一下下面的例子return -1;

2024-04-10 13:51:14 357

Django的富文本框中tiny_mce需要的js文件

Django的富文本框中tiny_mce需要的js文件

2022-02-11

遗传算法和粒子群算法的Python实现

遗传算法和粒子群算法的Python实现

2021-01-19

智能电风扇 (51单片机+proteus仿真)

单片机课设(智能电风扇设计,可以手动调节电机档位,根据温度调节档位,定时等功能)

2021-01-19

麦克风阵列资料.zip

MAX4468麦克风阵列资料,MAX4468麦克风阵列资料,MAX4468麦克风阵列资料,MAX4468麦克风阵列资料,MAX4468麦克风阵列资料,MAX4468麦克风阵列资料

2020-09-06

空空如也

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

TA关注的人

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