自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CodeBowl的博客

学妹的工具人,C++开发误入数据开发,梦想30岁退休的靓仔就是我啦

  • 博客(65)
  • 收藏
  • 关注

原创 std::thread创建线程,使用std::ref()传递类对象参数

stdref只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,stdref根本没法实现引用传递,只有模板自动推导类型时,ref能用包装类型reference_wrapper来代替原本会被识别的值类型,而reference_wrapper能隐式转换为被引用的值的引用类型。thread在使用类对象作为参数传递过程中,常常会出现多次拷贝构造的情况,理想中的情况是只需一次拷贝构造。stdref主要是考虑函数式编程(如stdbind)在使用时,是对参数直接拷贝,而不是引用。...

2022-07-24 14:59:00 269

原创 C++并发编程:线程安全链表

最近遇到这么一个问题,一个处理路径的函数,在多线程中被调用,我需要记录某个状态的路径,并在后续当再次处于某个状态时,从链表中将其取出。为了满足这个需求,用来存储的数据结构要满足: 1. 线程安全:防止在多线程中错误地对一个变量进行修改 2. 便于查询 3. 便于插入、删除 最终想来选择了线程安全的链表,同时备选的队列,但队列不满足便于查询。...

2022-07-24 14:43:45 759

原创 C++调试内存泄漏

内存泄漏(memory leak) 是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。...

2022-06-20 23:27:58 249

原创 不要再用if/else和switch/case了,快使用“表驱动法”代替,面向对象思维,对修改关闭。

表驱动是一种编程模式,是一种将输入变量作为索引在表里查找直接的结果或者处理函数,而不是用很多的逻辑语句来进行判断(比如if-sle||switch_case).索引表可以是个数组、map或者其他高效率查找的数据结构。...

2022-06-13 23:08:27 255

原创 PC端本地存储方案,Windows和Mac双端通用方案

功能要求:缓存数据没有频繁的读写,存储服务端下发的数据,当数据有更新的时候,本地存储会进行更新,同时刷新内存。本地存储作为持久化储存方案,程序每次启动时会读取数据加载到内存,当数据有更新的时候,也会进行内存刷新。从需求解析:存储的特点是持久化、稳定、读写频率不高。方案预研方案一:sqlite3本地存储方案二:文件存储sqlite3本地存储考虑这个方案的原因是,sqlite是一个成熟的跨平台存储方案,比较稳定和成熟,且在依赖的项目中,已经使用了sqlite3来进行本地存储,且在落盘的时候就可以

2022-05-17 22:43:02 418

原创 Windows:如何将普通进程注册为服务进程

最近遇到了一个需求:需要把普通进程封装为服务进程,将积累的几种方案记录下来Windows:如何将普通进程注册为服务进程进程和服务将进程改为服务一、通过代码来实现二、利用VS将窗口服务程序改为Windows服务于后台运行三、sc命令四、Instsrv.exe+Srvany.exe五、nssm注册简单介绍使用步骤总结进程和服务首先来了解一下什么是服务和进程进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操 作系统而言,其调度.

2022-01-05 22:53:11 2193 1

原创 std::string自带“/0”吗?怎么将string拷贝到char*?

std::string自带“/0”吗?怎么将string拷贝到char*?结论将string拷贝到char*字符串结论先说结论,string时不带“/0”的。这个问题在网上一直有很多种说法,我之前也一直认为string的结尾是自带“/0"的,但是在进行string拷贝到char*字符串的时候,发现了不对劲!我猜测的解释:c语言用char*指针作为字符串时,在读取字符串时需要一个特殊字符0来标记指针的结束位置,也就是通常认为的字符串结束标记。而c++语言则是面向对象的,长度信息直接被存储在了对象

2021-12-28 22:59:03 1001

原创 C++设计模式:抽象工厂模式

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

2021-12-11 21:04:10 2249

原创 C++接口设计的心得体会

今天在模块接口设计的时候,对如何设计一个好的接口,产生了疑惑。遂请教了俩位师傅,得到了俩条建议,私以为十分有用!

2021-12-02 00:04:52 539

原创 在Windows上安装git

Git是由Linus花俩周时间开发出来的分布式版本控制系统,之前只运行在Linux系统上,后来被扩展到了多平台上。今天进行在Windows安装Git!下载地址在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。...

2021-11-28 16:20:51 128

原创 用RAII的思想去管理Windows的读写锁SRWLock

前言最近对C++的RAII(资源申请初始化),又有了新的理解。我们C++中使用一个资源(例如 内存)的步骤:申请资源使用资源释放资源简述一下RAII:就是可以自动回收资源,将资源封装成对象。关键在于:变量的生命周期结束后,会自动释放变量。例如一个变量是局部变量,存储在栈上,那么当该函数结束后,这个变量就已经被释放掉了。那么,当变量是类变量的时候,当该类对象变量生命周期结束后,应该调用析构函数释放掉该资源!生命周期局部变量:存储在栈上,生命周期结束后,由栈释放。全局或静态变量:

2021-11-23 23:02:03 368

原创 Visual Studio 2022 正式版下载教程

visual studio的大版本vs2022终于在最近更新了,马上下载来试用一下!visual studio 2022 简介https://visualstudio.microsoft.com/zh-hans/vs/可以通过上面这个网址去看一下简介:下面的三个是最重量级的更新我认为对开发者最友好的应该是它的智能编码了,还有支持了最新的C++20标准。下载地址https://visualstudio.microsoft.com/zh-hans/vs/安装教程选择下载版本,这里我选择的是

2021-11-20 23:55:57 10191

原创 工程实践:Windows迅捷开发,可以提升效率的一些小技巧

本专栏为工程实践,主要是作为小白在开发中,积累的心得,是在技术和语言层次上的一些感悟和技巧,记录下来,备忘!Windows开发Windows开发,客观地说,现在学习确实有点49年进国军的感觉了。一般而言,所谓的Windows开发,我认为有一个标准就是是否是在Windows平台上采用微软自己专有的技术,比如你用VC++/MFC/COM或者WinForm、WPF开发一个客户端程序,用WinSocket,IOCP开发服务器端程序,用http://ASP.NET开发网站服务程序,用Direct3D开发.

2021-11-19 23:11:51 771

原创 工程实践:Windows包管理工具——VCPKG

工程实践:Windows包管理工具——VCPKG前言Windows C++开发使用第三方库使用第三方库存在的问题vcpkg的优点如何使用VCPKG总结前言作为推荐大家使用vcpkg来进行Windows开发,或者Windows、linux和mac跨平台开发的管理工具,熟练之后,可以大大提高效率!!!作为windows开发,推荐必会!Windows C++开发使用第三方库一般开发大型的Windows程序,都少不了使用开源的第三方库,例如我们要实现一个网络通讯的工程,自己实现一套的话,耗时耗力,还大概率

2021-11-19 22:51:39 441

原创 误入歧途的COM之旅(1):为什么我说是误入歧途

误入歧途的COM之旅(1)前言为什么将误入歧途呢?**COM历史**com简介com设计的出发点com的坑说说com的优点最后放一点com的争论贴总结前言首先此com非彼com(www.com),而是Windows的com机制!最近在项目中遇到了com相关的问题,说起来就离谱,我们要实现一个动态链接库提供服务,但是调用方是用com机制去调用的,并且要求这个调用方exe不能修改,也就是我要实现适应com接口去实现一个dll。但是更离谱的是,这个动态库应该是跨平台的,同时支持com和跨平台,咨询了好多

2021-11-18 23:58:13 492

原创 工程实践:到底要不要使用智能指针

前言写了很久的“C with class”,在接触到智能指针的时候,都有点欣喜若狂了,想的是,这下子不用再为new/delete头疼了,也不用担心内存泄漏了,但事实证明我太天真了。之前也学过modern cpp,甚至还总结过智能指针,但是看来没有实际的操作,空想还是太虚了!本文仅作新手经验所记,必不全面智能指针现状auto_ptr: 跟98的前辈say goodbyeunique_ptr:shard_ptr:我这个人擅长模仿学习,看见别人的代码里用的都是shared_ptr,所以在一段时间

2021-11-16 23:25:12 311

原创 智能指针不是解决内存泄漏的万能良药

背景最近在重构一个模块,模块中的接口有指针参数,我想把他改成智能指针,凡是接口要保持不变,就很难修改。接口类似func(int ** p1),不知道怎么用shared_ptr代表。**然后我就进行了一系列骚操作!从而也发现了智能指针的不当使用带来的内存泄漏和悬空指针的问题。内存泄漏内存泄漏(MemoryLeak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。悬空指针在C/C++等语言中,悬空指针(Dangl

2021-11-16 22:22:04 527

原创 C++跨平台(四):ZeroMQ的简单示例

跨平台的IPC:ZeroMQ学习前言ZeroMQ是什么本文要做的事情实验开始!!!!一、获取ZeroMQ源码二、构建ZeroMQvs配置简单的Server\Client实验结果参考资料前言因为在开发中需要使用zmq来进行跨平台的进程间通信需求的开发,故此学习。ZeroMQ是什么ZeroMQ官网ZeroMQ C++ 版GitHub地址以下是它对自己的介绍:总结一下:ZMQ看起来像是一个嵌入式网络连接库,但实际上是一个并发框架。框架提供的套接字可以满足在多种协议之间传输原子信息,如线程间、进程间

2021-11-13 23:32:43 948

原创 C++跨平台(三):进程间通讯(IPC)的技术选型

本系列继续记录,作为一个新人小白,在第一次接触C++跨平台(win、linux、mac)开发的经验和踩坑。前言在四个月前,我还是一名学生,开发一个功能,我的需求就是能跑就行,最多加一个没有bug。而现在,在一次次的开会中,我成为了憔悴的社会打工人,也明白了在代码开发前,更重要的是设计和架构,确定好大方向,后面的事情才能走在正确的道路上。开发一个功能,没有bug的运行自然是最低要求,但是往往在开发前,需要经过技术选型,选择一个最适合的方案,这几天有一个跨进程通信的需求,我们就使用什么方案也经过讨论.

2021-11-13 11:50:44 2726

原创 C++跨平台(二):grpc和zmq的方案预研

C++跨平台(二):grpc和zmq的方案预研前言gRpcgrpc是什么?protoBuf为什么选择grpc常见的使用场景进程间通信ZeroMQzmq是什么?ZMQ和Socket有什么关联呢?ZMQ的三种模式进程间的通信总结前言在进行跨平台开发中,跨进程通讯或者服务器通讯是必不可少的一环,在开发中,我们会选择成熟的第三方库来进行开发。今天就对跨平台的grpc和zmq进行方案预研。我的需求是:跨进程通讯gRpcgrpc是什么?gRPC是Google开源的RPC实现,基于最新的HTTP2.0协议,

2021-11-09 20:02:50 1827

原创 C++跨平台学习(一):入门了解

C++跨平台学习(一):入门了解跨平台开发说的是什么我们想通过跨平台来实现什么计算机语言的跨平台C\C++跨平台:“一次套代码,到处运行”一点点小的经验C++跨平台工具总结参考资料本文不涉及代码和过于深入的东西,只是小白在学习过程中,记录跨平台中的一些case,希望对同样刚接触跨平台开发的小白有所帮助。跨平台开发说的是什么跨平台开发,最典型的就是移动时代,厂商开发一个app往往需要Android和ios上俩套东西,同时还有着非常复杂的机型。为了解决不同操作系统终端的开发难题,跨平台技术成为了首选,为

2021-11-08 22:38:05 2089

原创 工程实践之路:C++接口设计中的工厂模型

工程实践之路:C++接口设计中的工厂模型设计模式之工厂模式为什么使用工厂模式1.工厂设计模式是为了将对象的创建与使用进行分离2.其他好处简单工厂模式工厂方法模式抽象工厂模式参考资料上一篇文章写了《工程实践:C++接口设计指北》主要写了用C++写第三库,如何设计接口的问题,其中用到了工厂模式,在此之前,一直不太明白《设计模式》在实际开发中的应用。现在正好被我逮到了,以此为例,深入学习一下!设计模式之工厂模式工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根

2021-10-30 22:27:49 137

原创 工程实践:C++接口设计指北

一般来说,有两种方法设计接口类。**第一种是PIMP方法,即Pointer to Implementation**,在接口类成员中包含一个指向实现类的指针,这样可以最大限度的做到接口和实现分离的原则。**第二种方法叫Object-Interface方法**,它的思想是采用C++的动态功能,实现类继承接口类,功能接口函数定义成虚函数。

2021-10-30 17:41:19 831

原创 逆向程序分析:C++的一个空类,为什么在内存中占1字节

逆向程序分析:C++的一个空类,为什么在内存中占1字节普通的空类空类的定义空类的内存大小为什么呢?带有虚函数的空类虚类空类在内存中的大小为什么?普通的空类空类的定义空类就是没有任何数据成员的类。空类的内存大小按道理讲,没有数据成员,就不会占用内存,那么空类的大小就为0。但是真实场景下,即便是空类在内存中,也占一个字节。#include <iostream>class CPeople{};int main(){ std::cout << "sizeo

2021-10-26 22:45:17 152

原创 俩句话理解VS的MT/MD和MTD/MDD。

VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试。DLL(/MDd)、单线程(/ML)、单线程调试(/MLd)。目前Win7、Win10等,选择MD问题不大,但是XP等一些比较老的系统需要选择MT。为什么这么说呢?下面我用俩句话解释一下MT和MD的区别。(1)/MD,表示运行时库由操作系统提供一个DLL,程序里不集成。编译出来的文件比较小。使用的库文件是 MSVCRT.lib(2)/MT,表示

2021-10-26 19:43:30 347

原创 逆向程序分析:Win32程序入口函数

逆向程序分析:Win32程序入口函数Winmain() Win32程序Winmain()函数说明参考资料现在是无线时代,从事Windows相关开发逆向工作的人越来越少,涌入的新人更是少之又少,目前自己也是新手,记录一下学习过程Winmain() Win32程序很多人可能不知道win32程序和控制台程序有什么区别,这个我们可以通过修改项目的属性配置来看一下:在这个地方,我们可以把项目属性修改为窗口程序,然后运行程序,发现会报错在这个地方,我们可以把项目属性修改为窗口程序,然后运行程序,发现会报

2021-10-23 21:05:36 2945

原创 逆向程序分析:Windows的main(),启动函数分析

@[TOC](Windows main() 启动函数分析)实验环境Windows10Vs2015x86程序启动函数C/C++的运行时启动函数,该函数负责对C/C++运行库进行初始化。启动函数的作用:检索指向新进程的命令行指针、检索指向新进程的环境变量指针、全局变量初始化、内存初始化等。当所有的初始化操作完成之后,启动函数会调用应用程序的进入点函数。调试实战我们写一个简单的main函数,然后F5进入调试。mainCRTStartup()这个函数调用了__scrt_common_ma

2021-10-23 17:27:00 564

原创 热补丁:为什么Windows API都以无意义的 mov edi,edi 开头?

为什么Windows函数都以无意义的MOVEDI、EDI指令开始?我们参考Windows 的反汇编,返现函数的开始都是以mov edi,edi,它看似毫无意义(该指令将寄存器复制到自己,并没有更新标志;这是完全没有意义的。)原因是:这是故意设计的热补丁(hot-patching)。热补丁这个MOV EDI, EDI指令是两个字节。NOP,这仅够在跳转指令中进行修补,以便可以动态更新函数,即运行时修改一个函数的行为。修改过程如下:把MOV EDI, EDI修改为一条短跳转指令(一条短跳转指令恰好

2021-10-18 22:23:59 205

原创 [Windows Hook]MinHook库的使用方式

MinHook就是通过Inline Hook实现的,通过生成库文件,在我们的项目中包含头文件以及对应库文件就可以实现Hook。学习一个库,先学习怎么用,然后再阅读源码学习原理。

2021-10-16 18:43:27 2609 1

原创 VS2022 Preview 尝鲜版 下载教程

作为一名新时代程序员,我一直喜欢用比较新的软件版本,之前在Windows开发用的一直是Visual Studio,今年是2021年,但是vs2022已经出了尝鲜版,遂下载,记录过程!下载地址vs2022下载如果上面的官网打不开的话,可以选择下面的这个网址:第三方下载更新内容其中我比较关注的是对于C++20的支持,还有增强的调试。增强的调试中vs集成了一些新的工具,对于开发者还是比较友好的!此外最牛逼的是:软件在全新的2022版本当中可以说是有一个跨时代的改革,这个版本将是第一款可以在64位

2021-10-15 14:56:19 606

原创 开源代码学习:json11源码阅读

本篇是《开源代码学习》的第二篇,上一篇为:《一文搞定json解析和封装问题,手把手带你学习CJSON开源代码》本文阅读一下json11的代码,json11是使用C++11编写的json库,对json11代码或者使用感兴趣的小伙伴可以阅读一下此文。json11...

2021-10-14 22:04:27 378

原创 json11详细使用教程,持续更新!

jsonJSON的全称是”JavaScript ObjectNotation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。json这里就不详细介绍了,看这个链接就可json详解json11json11是用C++11编写的一个第三方库,之前在解析json数据的时候,尝试了好几个json库,最终决定使用json11,主要有以下几个原因:json的通用功能可以像使用C++类一样使用中文不乱码,这是我选择这个库的主要原因json11的gith

2021-10-14 22:04:12 1604

原创 Windows Hook链机制详解

每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的。

2021-10-12 22:56:07 315

原创 Windows系统中文乱码,最简单解决方案,调用函数即可!

乱码原因windows下控制台的编码使用的是系统的默认编码,通常情况下是ANSI(GBK),如果输出乱码,那就是源文件编码和该编码不一致。解决方法一(不推荐)这种方式简单但不推荐,就是将你的源文件和系统默认编码改成一样。但这种方法的问题在于,如果有人在其他编码的环境(linux,osx下默认基本是utf8编码)下查看你的源码,他们看到的是乱码。解决方法二(推荐)麻烦一点,但是是个好习惯,用utf8编码的源文件,将utf8编码转成GBK后输出,win32下用MultiByteToWideChar,W

2021-10-12 22:22:17 6323

原创 CMake学习:使用camke创建一个最简单的跨平台c++项目

使用camke创建一个最简单的跨平台项目什么是CMake为什么选择cmakeCMakeLists.txt使用cmake创建一个简单的工程项目须知:我是在Windows环境下实验的。什么是CMakeCMake是一个跨平台的编译、安装、测试以及打包工具;CMake不直接编译软件,而是结合原生构建系统来构建软件。CMake配置文件是CMakeList.txt文件(每个源码文件夹下都要有一个),CMake根据配置文件在生成Unix的Makefile或VS的solution文件等。为什么选择cmake跨平台

2021-10-11 22:38:00 592

原创 Windows环境下读取文件,输出中文乱码原因剖析及解决方案!

Windows读文件中文乱码问题描述问题复现直接输出中文读文件原因分析**3.文件编码格式**解决方案问题描述这俩天,遇到了一个问题,解析json的时候,中文老是乱码。复现后,发现读取文件时,遇到中文,在控制台输出的时候也会乱码,遂进行详细分析和解决。问题复现直接输出中文//直接输出中文void test1(){ std::cout << "中文测试!" << std::endl;}直接控制台输出中文,没有毛病。读文件//读文件void test2

2021-10-10 16:51:40 2621

原创 Windows编程下的字符串格式及编码问题

大家在学习或者使用Windows编程中,经常会碰到字符串之间的转换,char*转LPCWSTR也是其中一个比较常见的转换。下面就列出几种比较常用的转换方法。大家可以根据自己的需求选择相对应的方法,下面来一起学习学习吧。为什么总结这个问题一些代码在其他平台下是正常的,但是在Windows环境下,经常遇到中文乱码的情况,很是头疼!1、通过MultiByteToWideChar函数转换MultiByteToWideChar函数是将多字节转换为宽字节的一个API函数,它的原型如下:int MultiByt

2021-10-10 16:14:32 380

原创 最好用的json库,也许是JSON for modern C++ 的最佳实践!解决nlohmann json中文无法解析的问题!

GitHub开源项的地址:https://github.com/nlohmann/jsonjson for modern c++是一个德国大牛nlohmann写的,该版本的json有以下特点:1.直观的语法。2.整个代码由一个头文件组成json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便。3.使用c++11标准编写。4.使用json 像使用STL容器一样。5.STL和json容器之间可以相互转换。如何使用?只需要带一个文件即可。#include <js.

2021-10-09 22:24:00 2003 3

原创 手把手教你用SetWindowsHookEx做一个键盘记录器

“无忌,我教你的还记得多少?”“回太师傅,我只记得一大半。”“那,现在呢?”“已经剩下一小半了。”“那,现在呢?”“我已经把所有的全忘记了!”“好,你可以上了!”羡慕张无忌,忘记了武功,打败了敌人;而我自己,忘记了武功,菜哭了自己。已经一年多没有接触这个了,忘得干干净净,幸亏肌肉记忆还在,学起来十分亲切,废话不多说,进入正题。SetWindowsHookEx制作键盘记录器前言消息Hook消息Hook流程通过setWindowsHookEx()实现键盘记录器**实现原理****安装钩子*.

2021-09-10 08:23:56 1088

原创 Windows Hook的简单介绍——此树是我栽,此路是我开

千里之行,始于足下!今天是正式启程的第一天,一直明白自己的缺点就是不够坚持,同时没有坚定目标,或许是目标不够诱人吧。但是如果我可以成为这个领域中相当牛逼的人,那还是十分有吸引力的。之前学习的过程中,学会了一项技术,时常感觉“无用武之地”,这应该是我自己学习的一个误区,之后自己会多在实战中检验技术,也希望有大佬多多指点。本文内容本文将简单介绍Windows Hook的基本内容,以及一些自己的看法,希望可以帮助您快速了解这一内容。HOOK是什么?Hook,中文里常常被译作“钩子”或者“挂钩”,其实是

2021-09-08 08:47:04 1318

空空如也

空空如也

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

TA关注的人

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