自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 dll使用不当导致的内存泄漏

在运行编译时这段代码并不会报错,运行结果也没有问题,但会导致内存泄漏,初步猜测是调用该函数时进行了值传递,导致了Mat矩阵发生了复制,但是该Mat矩阵并不会自动释放,所以会导致内存使用不断增加,最后程序崩溃。动态调用dll时函数声明和函数定义不一致会导致内存泄漏,比如有这样一段dll加载和函数声明。修改也很简单,保持函数定义和声明一致就行。

2023-07-11 17:29:06 275

原创 关于函数中创建数组破坏指针这件事

这三行代码上,如果将三行代码放到函数内,会导致链表中当前节点的next指针被破坏,经过该函数交换后的节点都无法继续使用,估计是栈空间里创建char数组的时候把next指针所在的位置覆盖了,按理来说不应该出现这种问题。解决办法也很简单,使用new或者malloc将数组分配到堆空间上或者是直接创建全局变量,也就是在函数外定义数组。写法很蠢,因为这是之前接单 用户给的代码,重构的话太麻烦了,只能将就着写,能完成功能就行。其实这问题比较离谱,大概就是在函数中创建char数组, 代码如下。

2023-06-28 15:04:19 87

原创 模板参数总结

这篇记录的是模板参数的按值传递和按引用传递,这里就直接放大佬的结论了。这里就没有必要定义为const T& v.默认情况下,使用按值传递。不要将模板参数设计的太通用。###模板参数声明的推荐。

2023-06-04 23:24:32 101

原创 汇编笔记以及实验4

问题在 mov [bx], bx 这里,更准确的用法应该是mov [bx], bl 因为bx是十六位寄存器,而ds:bx是一个字节单位(八位),所以写入的时候一次会写入两个内存单位。会发现由于每次写入两个内存单元,会导致前一次被写入的后两位被覆盖,从而产生错误结果,所以改用八位的bl寄存器,这样可以避免这种情况。最近在重温汇编,之前看汇编还是在大黑书上,看了一点X86的,现在算是系统的学习一下汇编,用的书是王爽的《编译原理》SS SP 都是对于堆栈段来说的,ss里面存放堆栈段的段地址,sp存放偏移地址。

2023-06-04 23:04:43 78

原创 Linux常用命令

这没啥好说的,不会就在前面加个man查看帮助。文件或目录处理常用命令。

2023-06-04 23:02:21 27

原创 Linux常用命令

这没啥好说的,不会就在前面加个man查看帮助。文件或目录处理常用命令。

2023-06-04 22:45:09 23

原创 C++模板总结2

如果为左折叠,则为(1+2)+3,右折叠则为1+(2+3)。加入函数调用时没有参数,则为空包,对于大多操作符,空包会引发编译错误,对于 && 或 ||, 空参数包是合法的, 其中 && 的展开结果为 true, ||的展开结果为 false. 在逗号 , 操作符中, 空参数包也合法, 展开为 void().感觉Linux也学得断断续续的,原本是打算在Linux上跑代码,但是cmake不支持C++17,试过网上的办法,都没成功,所以只能又转会Windows,Linux用来写算法得了,毕竟用不到新标准。

2023-06-04 22:44:45 69

原创 Linux学习笔记1

要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。第 2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限。其中,第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限;第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。

2023-06-04 22:44:42 24

原创 C++模板总结1

需要注意的是全特化版本中定义成员函数时不需要在函数前面加template的,但是要把Stack中的T替换成对应类型(偏特化时也要加),比string。这是一个比较简单的模板函数,作用就是比较a和b的值,但这里的返回值类型永远都是T1,考虑max(2, 3.1),返回值会变成3,因为T1是int类型.可以通过多加一个形参来指定返回类型。首先模板的生命与定义需要放在一个头文件,因为模板需要在编译阶段进行模板参数类型推断,实例化模板,所以就需要知道模板的定义,所以要放在一个头文件。

2023-06-04 22:42:08 42

原创 基于C++的Linux高性能服务器6

看起来相当的恐怖,采用了模板和大量的c++新特性,returnType为返回值类型,task是一个指向bind绑定的函数对象的返回值类型的指针,packaged_task用于封装bind的绑定对象,并能将其返回值传递给future对象,供后面res的get_future()调用。这次新增了很多东西,首先是Buffer类,用来处理接收或者要发送的信息,不再像以前一样收到一次发一次,而是把收到或者要发送的消息汇总起来,等到输入结束的时候在一起发送,其实用起来跟之前也什么区别,但是封装之后使用更方便一点。

2023-05-31 23:12:39 77 1

原创 基于C++的Linux高性能服务器5

然后传参loop,new一个Server对象,在Server的构造函数内new一个Acceptor对象,也就是上文提到的专门用来处理连接的对象,Acceptor构造函数创建一个Socket对象,该对象用于创建socket,并初始化一个Channel对象,Channel对象是用于对不同的文件描述符做不同处理的对象,通过绑定Eventloop对象(也就是Epoll对象)和一个文件描述符来做不同的处理。通过poll函数获取到活动的Channel对象,并调用之前绑定的回调函数进行事务处理。

2023-05-31 23:10:38 66 1

原创 基于C++的Linux高性能服务器4

经过一段时间的学习我们可以知道如果要服务器同时为多个客户端服务,最直接的方式就是为每一条连接创建线程\进程,处理完事件就可以销毁该线程,但不停创建和销毁会带来大量的性能开销,解决办法就是IO多路复用,该技术可以通过系统函数来监听我们关心的连接,在之前的博客中也提到过,selcet、poll、epoll都是Linux提供的现成的IO多路复用系统,区别就是select和poll都是基于轮询,同样会造成效率问题。将数据从内核空间拷贝到用户空间,这个拷贝过程同样是异步的,内核自动完成的,和前面的同步操作不一样,

2023-05-31 22:50:00 184 1

原创 基于C++的Linux高性能服务器3

该函数通过epoll_wait等待io事件发生,如果发生比如客户端连接或者读事件时则唤醒该函数,并返回事件数量,上文说到epoll里data结构里可以储存一个void*指针,如果要使用的话需要转换,说实话auto确实省事很多,可以不用过多纠结类型问题,但不能产生太大依赖。这次新增了一个Channel类,该类与一个文件描述符相关,不同的Channel负责不同的文件描述符,可以对不同的服务或者不同的事件类型做出不同的处理。使用的话,也是用智能指针来管理,然后设置监听读事件,当然也可以设置监听其他事件。

2023-05-31 22:47:17 56 1

原创 基于C++的Linux高性能服务器1

在Linux系统中一切皆文件,统一用文件描述符来代表一个文件,而socket也不例外,也是用文件来表示的,windows下也有相似的概念,叫句柄,通过句柄也可以操作对应的文件或者进程。谈到网络编程肯定离不开套接字(socket),套接字是网络中不同主机的应用进程之间进行双向通信的端口,通俗点来讲就是两个房子之间的门,通过这个门可以进出(收发消息),进行通信。开个新坑,基于C++的Linux高性能服务器,跟着教程来的,有些地方能用模板或者啥优化之类的也会试着用一用。

2023-05-31 22:28:52 149 1

原创 基于C++的Linux高性能服务器2

IO多路复用的基本思想是事件驱动,服务器同时保持多个客户端IO连接,当这个IO上有可读或可写事件发生时,表示这个IO对应的客户端在请求服务器的某项服务,此时服务器响应该服务。已知智能指针会自动销毁自己,如果在这里使用智能指针,那么服务器和客户端会进入一种奇怪的状态,表现为客户端能向服务器写信息,但是服务器接收不到,同理如果在创建该指针的if里最后delete指针,也会导致连接异常,可能该指针有一些特殊的用途,这里也无法解答,所以只能先放着。epoll_wait:等待其管理的连接上的 IO 事件。

2023-05-31 22:28:08 112

原创 Win32编程4-进程读取,创建,销毁

pszFilePath是全局函数,与读取文件时调用的是同一个函数OpenDlg,该函数通过打开一个对话框选择exe文件来获取文件路径并赋值给pszFilePath,以此来创建进程,CreateProcess函数的第二个参数是一个命令参数(大概这个意思),比如打开浏览器进程,第二个参数传入一个包含网址的字符串,可以在打开浏览器的时候自动打开该网站,具体可以自己了解一下。接着是创建进程,其中的STARTUPINFO结构是用于指定新进程的主窗口特性,cb成员是该结构的字节数。

2023-05-31 22:04:52 234 1

原创 Win32编程3-注册表读取,创建,修改

创建窗口原理与上述也一致,页面排版就不多说了,就是CreateWindow函数反复使用,在创建新窗口前会调用QueryRegValue查询键值名称,类型和值,具体解释都在注释里,这里不多叙述,DWORD类型是最简单的,就没写注释,每一种类型都是通过RegGetValue先获取值的大小,然后在读取值并用对应类型接收,最后转为CString类型,并赋值给r,这是全局CString。至此读取,创建,修改注册表的内容就结束了,上述操作经过测试都是可用的,但没有做太多的非法输入处理,主要是懒,而且也用不上。

2023-05-31 22:02:36 556 1

原创 Win32编程2-文件写入

写是能写,但是通过WriteFile写入文件或者ReadFile读取后会把文件指针放到文件开头,就是打开txt文件后光标总是在第一位,导致下一次读取时只能读入第一个字符,可能是打开文件模式的问题,但CreateFile的打开模式要么是直接重写,要么是从开头添加新内容,试遍了所有模式光标始终都在第一位,也尝试过用SetFilePointer重设指针位置,但导致了更多的bug,直接放弃了,在读入文件时还会读进来一些奇奇怪怪的东西,明明文件大小没问题,折腾了好几天了,直接弃了,不如进入下一步。

2023-05-31 21:43:03 113 1

原创 Win32编程1-文件读取

利用Windows的API函数打开文件,读取文件,修改文件。利用API函数创建注册项和值、读取注册项和值、修改注册项和值。利用API获取进程信息,创建进程,结束进程。 需求大概了解,页面设计原本打算三个按钮,然后对应三个新窗口,在新窗口实现各自的功能,但想了一下好像没必要,实际用得上的空间感觉没有那么大,把主窗口调大点应该能塞下。(上图为最终成品图)

2023-05-31 21:17:28 467 1

空空如也

空空如也

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

TA关注的人

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