Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

CPlusPlus智能指针简介

发表于 2021-11-13 | 更新于 2024-04-21

当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。

智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。

auto_ptr

auto_ptr的实现原理其实是在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。

smart_ptr

智能指针(smart_ptr)是Boost各组件中,应用最为广泛的一个。

Boost从很早就提供了如下的智能指针,并且功能一直保持稳定:

  • scoped_ptr:不可拷贝与赋值,承载new,只能在 scoped_ptr 声明的作用域内使用。
  • scoped_array:不可拷贝与赋值,承载new []。
  • shared_ptr:可拷贝,承载new。boost 库中重要组成,重点学习。
  • shared_array:可拷贝,承载new []。
  • weak_ptr:弱引用。
  • intrusive_ptr:需要自实现计数功能的,引用计数智能指针。

smart_ptr的一种实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
template <typename T>  
class smart_ptr
{
public:
smart_ptr(T *p = 0): pointee(p), count(new size_t(1)) { } //初始的计数值为1
smart_ptr(const smart_ptr &rhs): pointee(rhs.pointee), count(rhs.count) { ++*count; } //拷贝构造函数,计数加1
~smart_ptr() { decr_count(); } //析构,计数减1,减到0时进行垃圾回收,即释放空间
smart_ptr& operator= (const smart_ptr& rhs) //重载赋值操作符
{
//给自身赋值也对,因为如果自身赋值,计数器先减1,再加1,并未发生改变
++*count;
decr_count();
pointee = rhs.pointee;
count = rhs.count;
return *this;
}
//重载箭头操作符和解引用操作符,未提供指针的检查
T *operator->() { return pointee; }
const T *operator->() const { return pointee; }
T &operator*() { return *pointee; }
const T &operator*() const { return *pointee; }
size_t get_refcount() { return *count; } //获得引用计数器值
private:
T *pointee; //实际指针,被代理
size_t *count; //引用计数器
void decr_count() //计数器减1
{
if(--*count == 0)
{
delete pointee;
delete count;
}
}
};

c++ 11智能指针

c++ 11 提供了3种智能指针:std::shared_ptr、std::unique_ptr、std::weak_ptr,使用时引用头文件 。

  • shared_ptr允许多个指针指向同一个对象
  • unique_ptr则“独占”所指向的对象
  • weak_ptr,它是一种弱引用,指向shared_ptr所管理的对象

参考链接

  1. 智能指针,by 百度百科。
  2. C++各类设计模式及实现详解,by linux.
  3. C++智能指针auto_ptr详解,by CHENG Jian.
  4. boost 学习笔记 4:智能指针 smart_ptr,by einverne.
  5. 研究C++类的成员变量构造析构顺序,by paokuflying.
  6. C++智能指针作为成员变量,by caesar1228.
  7. 为什么建议你用nullptr而不是NULL,by 守望.
  8. C++11动态内存与智能指针,by herryone123.

spy++简介

发表于 2021-11-12 | 更新于 2021-11-13

开发某些自动化工具,第一步就是要获取目标窗口的句柄,然后通过该窗口句柄向该窗口发送消息,以实现自动输入等功能。而获取窗口句柄必然离不开Spy++工具。

GUI自动测试

HTML5 Canvas自动测试

参考链接

  1. Windows上spy++的安装和使用,by wyplj_sir.
  2. [WinAPI] 获取窗口句柄的几种方法,by beautifulzzzz.
  3. c# 获取当前活动窗口句柄,获取窗口大小及位置,by jack_孟.
  4. 通过获取窗口句柄模拟键鼠点击的一些方法,by unbalance_.
  5. Why do some windows not receive Windows messages,by stackoverflow.
  6. Spy++ alternative that can send messages,by stackoverflow.
  7. 哪些事情是 AutoIt 可以而 AutoHotkey 不行的?,by zhihu.
  8. AutoIt 软件自动化操作,by 邹龙彬.
  9. 游戏测试 游戏自动化测试三三二二,by IAmTester.
  10. 序、自动化测试概述,by Airtest Project Docs.
  11. Selenium详解,by 闲欢.
  12. canvas进阶——如何实现canvas的事件系统,by 我的蓝猫被削了.
  13. CANVAS 实现事件系统,by 阿飞.
  14. Canvas的高级绘制技巧和事件系统,by Canvas in deeps.
  15. 使用Selenium和openCV对HTML5 canvas游戏进行自动化功能测试(一),by silmerusse.
  16. 用 Selenium + OpenCV 来玩 HTML5 小游戏,by 郑恒.

CPlusPlus之从二进制文件中读取浮点数

发表于 2021-11-10

参考链接

  1. reading floating numbers from bin file continuosly and outputting in console window,by stackoverflow.
  2. C++ memcpy()函数用法,by iamzhangzhuping.

CPlusPlus之引用符号&的用法

发表于 2021-11-09 | 更新于 2024-04-26

符号&在C语言中代表取址符,在C++中则代表引用,是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。

引用简介

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

引用的声明方法:类型标识符 &引用名=目标变量名;

1
int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名

引用作为参数

引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。

1
2
void swap(int &p1, int &p2) //此处函数的形参p1, p2都是引用
{ int p; p=p1; p1=p2; p2=p; }

引用作为返回值

要以引用返回函数值,则函数定义时要按以下格式:

类型标识符 &函数名(形参列表及类型说明)
{函数体}

1
2
3
4
5
float &fn2(float r) //定义函数fn2,它以引用方式返回函数值
{
 temp=(float)(r*r*3.14);
 return temp;
}

引用作为返回值,必须遵守以下规则:

  • 不能返回局部变量的引用。
  • 不能返回函数内部new分配的内存的引用。
  • 可以返回类成员的引用,但最好是const。

参考链接

  1. c++&的用法,by Knigh_art.
  2. 我所理解的C++类设计中private成员变量和返回const引用类型,by Huming.
  3. C++返回引用的需求,by 唐淼.

CPlusPlus之Boost的JSON库操作

发表于 2021-11-08 | 更新于 2021-11-09

12月11日,Boost社区发布了1.75版本,带来了JSON,LEAF,PFR三个新库。其中JSON自然是json格式的解析库,来自Vinnie Falco和Krystian Stasiowski。

JSON库简介

其实在之前,Boost就已经有能够解析JSON的库了,名字叫做Boost.PropertyTree。Boost.PropertyTree不仅仅能够解析JSON,还能解析XML,INI和INFO格式的文件。但是由于成文较早及需要兼容其他的数据格式,相比较于其他的C++解析库,其显得比较笨重,使用的时候有很多的不方便。且存在以下问题:

  • 不支持 JSON 中的空数组
  • 所有类型信息都丢失了(所有内容都必须是 JSON 字符串)

Boost.JSON相对于Boost.PropertyTree来所,其只能支持JSON格式的解析,但是其使用方法更为简便,直接。华丽胡哨的东西也更多了。

参考链接

  1. Boost.JSON Boost的JSON解析库(1.75首发),by ink19.
  2. c++ - 如何使用 json 解析器的 boost property_tree 创建空数组节点,by coder.
  3. 【C++/Boost】 新增的JSON Library简介,by codeleading.

Ubuntu-18-04-Server安装图形界面和远程桌面连接

发表于 2021-11-06

远程云主机部署的Ubuntu 18.04 Server没有图形用户界面,而且自带的远程访问客户端不给力,因此考虑给Ubuntu 18.04 Server安装图形用户界面,同时打算使用Windows的

安装图形界面

Linux服务器未安装桌面环境。我们的第一步是安装X11和一个轻量级的桌面环境,该环境将充当Xrdp的后端。

Ubuntu存储库中有几种可用的桌面环境(DE)。我们将安装 Xfce 。这是一个快速,稳定且轻巧的桌面环境,非常适合在远程服务器上使用。

1
sudo apt update sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils

远程桌面连接

Xrdp是Microsoft远程桌面协议(RDP)的开源实现,允许您以图形方式控制远程系统。使用RDP,您可以登录到远程计算机并创建真实的桌面会话,就像登录到本地计算机一样。如果您想要开放源代码的远程桌面访问解决方案,请使用 VNC 。

安装Xrdp

1
2
sudo apt install xrdp
sudo systemctl status xrdp

配置Xrdp

1
2
3
4
5
sudo nano /etc/xrdp/xrdp.ini
# 在文件末尾添加以下行:
# exec startxfce4
# 保存文件并重新启动Xrdp服务
sudo systemctl restart xrdp

配置防火墙

1
2
sudo ufw allow from 192.168.1.0/24 to any port 3389
sudo ufw allow 3389

连接到Xrdp服务器

如果您是Windows用户,则可以使用默认的RDP客户端。在Windows搜索栏中键入“ remote”,然后单击“ Remote Desktop Connection”。这将打开RDP客户端。在计算机字段中输入远程服务器IP地址,然后单击“连接”。

参考链接

  1. Ubuntu server 18.04 安装图形化界面环境,by alits.
  2. 如何在Ubuntu 18.04上安装Xrdp Server(远程桌面),by myfreax.

CPlusPlus之Boost入门

发表于 2021-11-01 | 更新于 2021-11-08

Boost C++ 库(Libraries)是一组扩展C++功能的经过同行评审(Peer-reviewed)且开放源码程序库。大多数的函数为了能够以开放源码或者封闭项目的方式运作,而许可于Boost软件许可协议(Boost Software License)之下。许多Boost的开发人员是来自C++标准委员会,而部分的Boost库成为C++的TR1标准之一。

为了要确保库的效率与弹性,Boost广泛的使用模板(template)功能。而它是针对各式领域的C++用户与应用领域(Application Domain)上,包含的库类别从像smart_ptr 库(页面存档备份,存于互联网档案馆)这种类通用库,到像是文件系统的操作系统抽象层,甚至能够利用Boost来开发额外的库或是给高级的C++用户利用,像是MPL。

源代码下载

1
2
git clone https://github.com/boostorg/boost.git
git submodule --update

编译过程

生成编译工具b2.exe:

1
2
cd %BOOST_ROOT%
bootstrap.bat
  • 完整安装boost
1
b2 --buildtype=complete
  • 定制安装boost
1
2
3
4
5
6
# 可查看所有必须编译才能使用的库
b2 --show-libraries
# 单独编译安装regex库:
b2 --with-regex link=static runtime-link=shared threading=multi –-stagedir=build stage
# 生成include文件夹
b2 --with-regex link=static runtime-link=shared threading=multi --prefix=build install

编译结果在stage\lib目录下生成regex库(Debug/Release):

1
2
libboost_regex-vc100-mt-1_77.lib
libboost_regex-vc100-mt-gd-1_77.lib

相关参数的含义:
stage 仅创建和安装库文件(不创建头文件),可以用 –stagedir= 选项指定库的安装位置,默认安装在当前目录下的stage文件夹内。
–with- 创建和安装指定的库,如果使用了这个选项,则仅仅指定的库被创建,其它库不被创建。如果不指定这个选项,默认创建所有需要编译安装的库。
link=static指定生成静态regex库
threading=multi指定生成多线程库
runtime-link=shared指定动态链接C和C++ 运行库

参考链接

  1. Boost编译与使用,by luckyum.
  2. Parsing Command Line Arguments in C++?,by stackoverflow.
  3. Boost.Program_options,by Boost.
  4. Boost.JSON,by Boost.
  5. Boost C++ Libraries,by wikipedia.
  6. Boost Getting Started on Windows,by Boost.
  7. Windows平台下boost库的编译和调用,by JasonLiThirty.
  8. windows下编译和安装boost库,by rangers.
  9. C++静态库与动态库,by rangers.
  10. boost::program_options 用法详解,by morning_color.
  11. C++ Boost JSON解析库的使用,by miaoerduo.
  12. boost.xml_parser中文字符问题,by mob604756f44f2a .
  13. Creating JSON arrays in Boost using Property Trees,by stackoverflow.
  14. Boost.JSON Boost的JSON解析库(1.75首发),by ink19.
  15. c++ - 如何使用 json 解析器的 boost property_tree 创建空数组节点,by coder.

C/C++文件读写操作

发表于 2021-10-30

基于C的文件操作

流式文件操作

这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio.h中定义。

I/O文件操作

这是C提供的另一种文件操作,它是通过直接存/取文件来完成对文件的处理,而上篇所说流式文件操作是通过缓冲区来进行;流式文件操作是围绕一个FILE指 针来进行,而此类文件操作是围绕一个文件的“句柄”来进行。

基于C++的文件操作

在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O。

基于WINAPI的文件操作

WINAPI提供了两种文件操作函数,一组是为了和16位程序兼容,这种函数比较简单;而另一种是专门为32位程序设计。

参考链接

  1. C/C++文件输入输出操作——FILE*、fstream、windowsAPI,by 苦涩的茶.
  2. C++的iostream标准库介绍+使用详解(转),by 极客先锋.
  3. malloc和free函数详解,by Healtheon.
  4. C/C++堆、栈及静态数据区详解,by Healtheon.
  5. C++——使用变量作为数组长度,by dreamiond.
  6. C++ STL中容器的使用全面总结,by jimofanhua0000.
  7. c++ new/delete的用法,by liuhmmjj.

WebSocket协议分析方法

发表于 2021-10-13 | 更新于 2021-10-16

参考链接

  1. AG通过WSS协议实现自动化分析,by qq.
  2. Bilibili 直播弹幕抓取 (1):WebSocket,by 澪同学.
  3. Bilibili 直播弹幕抓取 (2):Fiddler 与 WireShark,by 澪同学.
  4. Bilibili 直播弹幕抓取 (3): 弹幕传输协议分析,by 澪同学.
  5. Burpsuit注册机使用时报错java.math.MutableBigInteger.inverseMod64(J)J,by 云勺.
  6. Burp Suite 实战指南,by t0data@hotmail.com.

Pipenv最新一代Python项目环境与依赖管理工具

发表于 2021-09-21 | 更新于 2022-05-14

Pipenv是一个工具,旨在将所有打包世界(bundler、composer、npm、cargo、yarn 等)中最好的东西带到 Python 世界。在我们的世界中,Windows 是一等公民。

它会自动为您的项目创建和管理 virtualenv,并Pipfile在您安装/卸载软件包时从您的项目中添加/删除软件包。它还生成Pipfile.lock用于生成确定性构建的 ever-important 。

Pipenv 主要旨在为应用程序的用户和开发人员提供一种设置工作环境的简单方法。

Pipenv 寻求解决的问题是多方面的:

  • 您不再需要单独使用pip和virtualenv。他们一起工作。
  • 管理requirements.txt文件可能会有问题,因此 Pipenv 使用* * Pipfile并将Pipfile.lock抽象依赖声明与上次测试的组合分开。
  • 哈希值无处不在,总是如此。安全。自动暴露安全漏洞。
  • 强烈鼓励使用最新版本的依赖项,以尽量减少过时组件带来的安全风险。
  • 让您深入了解您的依赖关系图(例如)。$ pipenv graph
  • 通过加载.env文件简化开发工作流程。

安装

如果您已经拥有 Python 和 pip,您可以轻松地将 Pipenv 安装到您的主目录中:

1
$ pip install pipenv

创建虚拟环境

1
2
$ cd your_project_dir
$ pipenv install

激活虚拟环境

1
pipenv shell

安装依赖到虚拟环境

1
$ pipenv install Scrapy

记录依赖

使用Pipenv时,什么都不必做,Pipenv会自动帮你管理依赖。Pipenv会在你创建虚拟环境时自动创建Pipfile和Pipfile.lock文件(如果不存在),并且会在你使用pipenv install和pipenv uninstall命令安装和卸载包时自动更新Pipfile和Pipfile.lock。

在部署环境安装依赖

使用Pipenv则只需要执行pipenv install,它会自动安装Pipfile中记录的依赖:

1
$ pipenv install

参考链接

  1. Virtualenv简易教程,by jackhuang.
  2. 最全的Python虚拟环境使用方法,by Stevent.
  3. Pipenv:新一代Python项目环境与依赖管理工具,by 李辉.
  4. Python 修改 pip 源为国内源,by 花晓星辰.
  5. pip安装包时出现 ValueError: check_hostname requires server_hostname 错误,by 胡小包.
  6. pyenv install build failed:Fatal: You must get working getaddrinfo() function.,by Honcy Ye.
上一页1…202122…52下一页

Jack Huang

519 日志
66 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse