- 博客(86)
- 资源 (16)
- 收藏
- 关注
原创 Win32 API中内存的申请与释放
之前在做内存泄漏分析模块功能开发时,发现在windows下的输出结果并不是很准确,很多内存泄漏都显示是在windows的api或crt函数中,比如CoInitializeEx,stderror,IsOS等。 以CoInitializeEx为例,调用CoUninitialize后,它申请的内存并没有相应的free掉;stderr中,申请的内存也没释放; &
2022-02-16 17:05:12 1860
原创 LuaJIT开发过程中的注意事项
LuaJIT中的bug和改进点1,不支持正则表达式中\\\s的语法2,不支持读取文件的全部内容3,x64下luaL_newstate不支持自定义内存分配函数LuaJIT虽然是一个非常优秀的lua开源库,但是在使用过程中,还是发现了它的一些bug以及改进点,下面简要描述一下在实际项目开发中碰到的问题。本文持续更新。1,不支持正则表达式中\\s的语法在lj_lex.c文件的lex_string函数中,对lua语句进行解析时,下面这些case(截图不完整,详细的case看代码),三个斜杠加上字符串都不支持
2021-09-18 15:01:05 477
原创 程序的编译与链接
程序的编译与链接一,预处理二, 编译1,词法分析2,语法分析3,语义分析4,中间语言的生成5,目标代码生成和优化三,链接 在日常的应用程序开发过程中,我们很少需要关注软件的编译和连接过程,特别是对于常用的集成开发环境visual studio,它将编译和链接的过程封装起来,一步完成,称为“构建”。 &n...
2020-03-08 23:20:41 9223
原创 在C++中使用信号和槽(sigslot库介绍,含demo链接)
在C++使用信号和槽(sigslot库介绍)一,使用场景二,sigslot库简介1,参数类型2,信号连接与槽3,信号与槽的断开4,信号的触发5,信号的线程安全6,槽的线程安全三,样例演示一,使用场景 在日常的代码开发过程中,我们经常会用到一种场景:当某个业务触发的时候,我们需要通知到不同的模块,让各个模块来处理这些触发的业务。这也就是设...
2020-02-29 20:25:09 11609
原创 Mysql 表字段修改 并发情况下避免重复
Mysql 表字段修改 并发情况下避免重复一,场景二,问题三,解决方案一,场景 多个用户同时修改用户名时,存在用户名相同的情况,而由于业务需要,用户名是不允许相同的,需要避免重复。二,问题 sql语句举例(伪代码): If(name not exited) (1) {...
2020-02-29 15:40:29 10861
原创 (TeamTalk服务端源码分析三)route_server源码分析
route_server源码分析 Route_Server是路由服务器,当存在多个MsgServer时,用户可能登陆在不同的MsgServer上(由Login_Server进行负载均衡),那么对于连接在不同的Msg_Server上的两个用户A和B如何进行消息转发呢,这个时候就需要用到Route_Server。 &n...
2019-12-09 21:01:08 8563
原创 (TeamTalk服务端源码分析二)Login_server源码分析
Login_server源码分析 Login_server是Teamtalk客户端最先通信的后台服务程序,客户端发送请求到login_server获取到负载最小的msg_server的地址,端口等信息,然后再连接到相应的msg_server上,发送登录请求,完成登录的流程。这样看来,虽然这个服务器名称是叫login_server,但是它承...
2019-11-21 20:29:01 8944
原创 const char * 和 std::string.c_str()引起的坑
const char *和std::string.c_str引起的坑一,发现问题二,解决方法今天早上有同事说调用封装好的编码转换函数,有时候能转换成功,有时候转换会失败,一听现象我就猜测是用法导致的问题,定位下来果然是用法使用有误,当然也跟我们封装的函数有关,记录下来,避免再次采坑。一,发现问题该编码转换函数实现如下://ANSI转UTF8static std::string AnsiT...
2019-08-21 19:47:45 9622
原创 修改lib库对应的dll名称
修改lib库对应的dll名称 在某些场景下,我们需要修改lib库对应的dll名称,这当然不是简单的给dll重命名一下,或者使用notepad++等工具打开lib文件,修改其中的dll名称。后一种方式会直接导致lib文件破坏,vs编译报错。 既然不能直接从lib下手,我们可以逆向考...
2019-07-08 20:14:46 10451 2
原创 amqp_basic_publish报错AMQP_STATUS_TABLE_TOO_BIG
amqp_basic_publish报错AMQP_STATUS_TABLE_TOO_BIG今天在做业务的时候,碰到一个奇怪的现象,发送同样属性和内容的消息,到相同的交换机上,debug模式下能发送成功,release模式下发送失败,并且报错AMQP_STATUS_TABLE_TOO_BIG,查看rabbitmq源码解释这个报错如下:简单解释就是:由于消息体太小,amqp_table_t不能被...
2019-06-20 20:59:09 5963
原创 查看dll的附加依赖项
查看dll的附加依赖项一,vs的dumpbin二,depends最近做的项目除了主程序,其他都是插件,动态加载运行的,有时候缺少依赖项而运行不起来,因此总结了两种查看dll依赖项的方法。一,vs的dumpbinvisual studio编译器自带有dumpbin工具,可以通过它查看exe或者dll的依赖项。通过开始菜单打开vs命令行工具。输入dumpbin /dependents 文件名...
2019-06-19 19:45:54 13808 1
原创 LoadLibrary失败,GetLastError= 193
LoadLibrary失败,GetLastError= 193LoadLibrary失败,GetLastError报错193时,一般是加载的dll所依赖的某个dll它的依赖项不存在所报的错,可以用Dependency Walker验证该dll所依赖的加载项是否都存在。Dependency Walker安装vs时一般都自带有,如果没有也可以去官网下载http://www.dependencywal...
2019-06-10 09:02:40 17924
原创 RabbitMQ-operation queue.declare caused a channel exception precondition_failed错误
RabbitMQ-operation queue.declare caused a channel exception precondition_failed错误今天早上有个同事在RabbitMQ服务器上做测试时,连续publish message两次都导致RabbitMQ服务挂掉,进程直接中止。但是按照他的描述我发布同样的消息,却是正常的。第一反应是查看日志,进入mq的日志目录,默认位置为:...
2019-05-07 22:44:51 13453
原创 RabbitMQ-topic主题模式
RabbitMQ-topic主题模式 Topic: 所有符合routingKey(此时可以是一个表达式)的routingKey所绑定的队列可以接收消息; 发送到topic类型交换机的消息的routing_key不能随便设置–它必须是多个单词组成,用点分割。单词可以是任意的,但它们...
2019-05-05 19:48:34 12140
原创 RabbitMQ-direct直通模式
RabbitMQ-direct直通模式 direct: 把Exchange上的消息发送到匹配routing key的队列中。 消费者队列绑定关键字到交换机上,发送者将数据根据关键字发送到交换机上,交换机根据关键字去遍历绑定到它上面的队列,将数据发送至指定关键字的队列。&nbs...
2019-05-02 15:10:46 6260
原创 C++虚表地址和虚函数地址
C++虚表地址和虚函数地址虚函数是c++实现多态性的一个重要知识点,本文主要解析虚函数在内存中的地址,以及与虚表地址的关系。声明一个类,包含两个虚函数,一个普通成员函数和一个类成员。调试程序,查看test对象的内存分布如下:_vptr是一个指向虚表的指针,可以理解为一个int* p[2],在本例中,p[0]是指向Test::func1()地址的指针,p[1]是指向Test::func2...
2019-04-12 20:17:44 8418
原创 C++ RabbitMQ封装
C++ RabbitMQ封装RabbitMq的源码可以在官网下载https://www.rabbitmq.com/,需要使用cmake转为vs工程。由于源码不大,此处选择编译librabbitmq,生成librabbitmq.4.lib静态库,直接链接到自己的程序中。附上vs版的源码,我使用的是vs2017,低版本的可以自行百度修改vs版本。首先封装CQueue类,包含队列的持久化,自动创建...
2019-03-28 18:43:00 11535 4
原创 RabbitMQ-fanout广播模式
RabbitMQ发送模式之fanout fanout: 所有bind到此exchange的queue都可以接收消息(纯广播,绑定到RabbitMQ的接受者都能收到消息); 消息的接受者需要创建一个队列,绑定到该fanout交换机上,监听来自发送端的消息广播。广播是实时的,prod...
2019-03-28 18:25:15 6542 1
原创 makefile通用模板
makefile通用模板结合自己编译redis测试代码,总结出一个makefile模板,以下makefile是以redis的测试代码为例进行验证的(请见我另一篇博文Linux下C++访问Redis)#wildcard把 指定目录 ./ 和 ../lib 下的所有后缀是cpp的文件全部展开。SRCS = $(wildcard *.cpp)#OBJS将$(SRCS)下的.cpp文件转化为.o...
2019-02-20 22:30:01 6666
原创 TeamTalk客户端源码分析七
TeamTalk客户端源码分析七一,CBaseSocket类二,select模型三,样例分析:登录功能     上篇文章我们分析了network模块中的引用计数,智能锁,异步回调机制以及数据的序列化和反序列化操作,本文主要介绍该模块中socket通信的实现。一,CBaseSocket类&a
2019-02-13 19:55:05 7617 9
原创 TeamTalk客户端源码分析六
TeamTalk客户端源码分析六一,引用计数和锁二,异步操作三,数据序列化和反序列化四,socket封装上篇文章介绍了httpclient模块,TeamTalk中还有一个网络模块network,它也是一个单独的动态库,内部只支持TCP通信,提供了网络回报异步通知的机制,并且通过Google Protocol Buffer(推荐学习博文Google Protocol Buffer 的使用和原理)对...
2019-02-02 17:22:13 7757
原创 const_cast,dynamic_cast,reinterpret_cast,static_cast四种转换的区别
const_cast,dynamic_cast,reinterpret_cast,static_cast四种转换的区别一,const_cast一,dynamic_cast一,reinterpret_cast一,static_castC++是一种强类型语言,对类型的检查非常严格,我们可以使用C语言中的(NewType)Expression来对某个变量或者表达式返回值进行强转,也可以使用C++中提供...
2019-02-02 09:34:19 18234 6
原创 C++仿函数和Lambda表达式
C++仿函数和Lambda表达式一,普通函数二,仿函数三,Lambda表达式四,Lambda外部变量捕获     在使用algorithm算法库中的很多函数时,最后一个参数都是需要传入一个函数指针,当对数组或者容器数据遍历时,通过函数指针指向的函数内部的逻辑处理进行过滤,筛选出符合条件的值并进行结果统计或返回。第三个参数的实现形式,从最开始的普通...
2019-01-21 20:14:58 14506 1
原创 阿里云网站备案与域名解析操作流程
阿里云网站备案与域名解析流程之前一直没有完整的做过域名解析绑定和网站域名备案,这次从头到尾操作了一次,比较顺利,特记录下操作步骤,以作备忘。1,登录注册了域名的阿里云账号,对于非万网注册的域名可以进行导入到阿里云来进行管理。2,进入域名解析列表3,点击“解析设置”,点击“新手引导”,在“网站解析”页面添加您网站所在服务器ip地址,在“邮箱解析”页面添加将要将域名指向的邮箱(域名注册信息...
2019-01-12 11:54:26 12293
原创 C++修改图片大小
C++修改图片大小一,OpenCV改变图片大小二,FreeImage改变图片大小三,结论     前段时间做一个项目需要将4K的图片缩小为A纸大小(595.0 * 842.0),在网上找了几种方式,最终决定直接选用第三方库Opencv和FreeImage,并对这两种方法的效果做了一个对比,由于图像处理没有深入学习过,在此只看处理后的效果,不做具体...
2019-01-02 21:45:05 13421
原创 socket关闭close和shutdown的区别
socket关闭close和shutdown的区别close——只是减少该socket id的引用计数,并不直接关闭网络连接,其他使用这个socket id的进程还可以正常进行网络通信的读写操作。直到引用计数为0,才释放套接字shutdown——可以直接关闭网络连接,由第二个参数决定当前socket id的网络连接是可读,还是可行,或者读写全部禁止(也即socket完全关闭)shutdown...
2019-01-02 18:56:44 8853
原创 浅析Windows程序输入法工作原理
浅析Windows程序输入法工作原理一,输入法结构介绍二,Windows消息循环捕捉键盘消息三,总结 输入法程序也是一个进程,但是我们在任务管理器中却找不到该进程,找到输入法的安装目录会发现一个后缀是.ime的文件,就是一个dll的模块,当一个进程打开输入法要输入汉字的时候其实是加载了这个模块。一,输入法结构介绍1),IMM-输入法管...
2018-12-23 22:28:56 10307
原创 判断一个链表是否有环
判断一个链表是否有环(c/c++实现)方法一方法二方法三给出一个单向链表,判断链表中是否存在环。虽然是一个实际工作中基本不会碰到的场景,但是面试的时候总是会考到,因此整理下各种解法,以免需要的时候用到。温故而知新!方法一第一种方法是大家都能想到的,就是利用空间来换时间:遍历链表中的每一个节点,放入一个容器中(此处使用std::set,查找速度快),每次插入容器的时候,判断是否已经存在相同节点...
2018-12-17 20:18:08 8834
原创 TeamTalk客户端源码分析二
TeamTalk客户端源码分析二一,GroupList二,UserList,Session上一篇文章介绍了TeamTalk中的观察者模式回调机制,主要使用方法有三步:1,不同的业务各自继承一个ModuleBase2,在各个需要用到该业务的类中去将当前类绑定到该业务的观察者中。3,在触发的地方调用asynNotifyObserver本节再来介绍Modules工程中基于ModuleBase实...
2018-12-09 11:03:11 8336
原创 C++实现客户端升级流程
C++实现客户端升级流程一,需求分析二,主程序实现三,升级程序实现四,升级程序实现自己做的股票行情软件最近需要做一个自动升级的功能,正好也想着把之前学的技术知识点做一个总结,因此,在这里记录下实现自动升级的大概流程以及部分代码。一,需求分析程序升级最常见的架构就是C/S架构了,包括主程序客户端,升级程序客户端,服务端程序。客户端每次启动向服务端发送请求,获取到最新版本号,与本地版本号进行对比...
2018-11-14 19:35:23 15148
原创 realloc函数使用注意事项
realloc函数使用注意事项realloc是c语言中常用的内存重分配函数,函数声明如下:/*** 重新分配内存大小* @param mem_address: 需要改变内存大小的指针* @param newsize: 内存新的大小* @return void**/void *realloc(void *mem_address, unsigned int newsize);rea...
2018-11-09 16:49:37 9713
原创 IOCP完成端口模拟线程池
IO完成端口的使用一,样例介绍一,样例介绍生产者-消费者模式是一种非常常见的设计模式,它可以很好地模拟实际编程中的大部分使用场景,而IO完成端口也是用来实现多线程之间的通信,因此,本实例基于该模式完成。首先,我们需要创建IO完成端口,最后一个参数为0,默认创建的IO完成端口数目就是处理器数目,同时,和要创建一定数目的消费者线程,来处理数据。//创建1个IO完成端口(最后一个参数为0表示创建...
2018-11-08 17:55:30 9006
原创 ANSI,UNICODE,UTF8之间的相互转换
ANSI,UNICODE,UTF8之间的相互转换ANSI转UNICOEUNICODE转ANSIUTF8转UNICODEUNICODE转UTF8ANSI转UTF8UTF8转ANSIANSI转UNICOEstd::wstring AnsiToUnicode(const std::string &strAnsi){ //先获取到转为unicode后的长度 int nUnicodeLe...
2018-10-23 10:15:10 14804
转载 unicode,ansi,utf-8,unicode big endian编码区别
unicode,ansi,utf-8,unicode big endian编码区别1. ASCII码2、非ASCII编码3.Unicode4. Unicode的问题5.UTF-86. Unicode与UTF-8之间的转换7. Little endian和Big endian8. 实例9. 延伸阅读1. ASCII码我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位...
2018-10-18 15:04:19 10046
原创 RapidXml读取并修改XML文件
RapidXml读取并修改XML文件RapidXml介绍RapidXml读取与修改xml文件RapidXml介绍RapidXml尝试创建最快的XML解析器,同时保留可用性,可移植性和合理的W3C兼容性。它是一个用现代C ++编写的原位解析器,解析速度接近strlen在同一数据上执行的函数。它仅仅只由四个头文件组成,并不要单独进行配置编译,使用起来非常方便。在RapidXml的官网上,它发布了...
2018-10-18 11:42:37 11706
转载 [转]GDI 泄漏检测方法
GDI 泄漏检测方法方法一方法二方法三转载至https://www.cnblogs.com/doudongchun/p/3699695.html方法一1、打开电脑的【任务管理器】,选择【进程】页,点击菜单项的【查看】项,选择【选择列】;2、勾选【GDI对象(J)】即可。3、此时,用户就可以在进程中看到每个进程对应的GDI对象,每个进程的GDI对象(网页浏览器除外,每打开一个网页GDI...
2018-10-15 11:17:16 8237
原创 c++实现rtsp点播客户端
c++实现rtsp点播客户端RTSP协议简介LIVE555的testRTSPClient.cpp简介RTSP视频流的处理RTSP协议简介简单来说,RTSP协议是一种基于命令形式的协议,对于服务端S和客户端C,两者的命令交互过程为:第一步:查询服务器端可用方法1.C->S:OPTION request //询问S有哪些方法可用1.S->C:OPTION respo...
2018-10-11 20:12:21 15245 1
原创 冒泡算法及其改进算法
冒泡算法及其改进算法冒泡算法介绍改进算法1改进算法2结果比较冒泡算法介绍冒泡算法的原理是:根据轻气泡不能在重气泡之下的原则,按一定顺序扫描数组:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。到此排序结束。比如对{6,2,3,1,7}进行冒泡排序(从小到大)第一次遍历结束后,结果为:1 6 3 2 7第二次遍历结束后,结果为:...
2018-10-11 13:48:33 12919
原创 Excel插件对话框中edit控件无法输入问题
Excel插件对话框中edit控件无法输入问题问题起因解决方案问题起因今天在做需求的时候,创建了一个全新的MFC非模态对话框,对话框中用到了edit控件,结果发现,在这个edit控件中输入任何的内容,都显示到了excel中选中的那个单元格中去了,而edit内容还是为空。因为edit也是我们重写的,只是给它加了个皮肤,功能是没有影响的,所以首先在OnChar那里打了个断点,发现并没有进来(edi...
2018-09-28 22:46:13 8342 3
原创 STL中的map容器屏蔽掉自动排序
STL中的map容器屏蔽掉自动排序map容器介绍屏蔽map自动排序map容器介绍template < class Key, class T, class Compare = less,class Allocator = allocator<pair<const Key,T> > > class map;key:关键
2018-09-25 16:02:16 20958 12
Signal.rar
2020-02-29
RabbitMqTest.rar
2019-11-25
VC6.0中文安装包,以及Visual Assist X for VC6.0,本人一直在使用
2019-01-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人