自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 问答 (1)
  • 收藏
  • 关注

原创 【C++11】线程池类简单说明

线程池是C++11标准引入的,是一种多线程并发编程的实现模式,它可以在程序启动时预先创建一定数量的线程,并将这些线程放入一个线程池中,以便在需要时可以快速地分配任务给线程执行,从而提高程序的并发性和执行效率。线程创建和销毁开销:频繁地创建和销毁线程会带来较大的开销和时间的浪费,影响应用程序的性能。线程调度的开销:操作系统在调度线程时也需要花费一定的时间和资源。当有大量线程需要调度时,这些开销会显著增加,进一步影响应用程序的性能。

2024-04-30 16:49:45 305

原创 【C++11】多线程创建/互斥详解

C++多线程的创建和管理

2024-04-30 16:37:28 768 1

原创 【C++11】范围for循环使用详解

C++11引入了范围for循环(range-based for loop),使得遍历容器变得更加简洁和方便。范围for循环使用一对迭代器来定义容器的范围,并自动迭代容器中的每个元素。

2023-11-24 18:29:15 232

原创 【C++11】nullptr关键字使用详解

C++11引入了nullptr关键字,它是一种空指针类型,用于表示空指针。总的来说,nullptr是以一种更安全、更清晰的方式来处理空指针。只要正确理解和合理使用,它就能够帮助我们编写出质量更高、更容易维护的代码。

2023-11-24 18:13:59 553

原创 C++程序中dump文件生成方法详解

最近项目中新作成了一个动态链接库,长时间运行后,偶尔会崩溃。根据log分析,被调用的动态库函数最外层catch到了这个异常,但是不能定位哪里出了问题。另外虽然上层exe是有dump文件输出处理的,但是在C++中,如果异常被捕获并处理的情况下,系统就不会生成dump文件了。如果仍希望在try-catch块中捕获异常的同时生成dump文件,就必须在catch块中手动调用生成dump文件的函数。这样可以在异常被捕获后仍然生成dump文件以供后续分析。本文详细介绍下怎么生成dump文件。

2023-11-23 18:49:22 2105

原创 【C++11】=default与=delete关键字使用详解

但是,使用=delete关键字相比直接删除函数,能更清晰、更明确地表达我们的意图,提高代码的可读性和可维护性。通过查看函数前面的=delete关键字,我们可以快速地判断出这个函数是否应该被调用,而不必去深入阅读函数的实现细节。但是,如果我们不想让某个操作符被重载,可以使用=delete关键字来删除它。但是需要注意的是,只有在必要的情况下才应该使用=default关键字,否则可能会影响程序的性能和可读性。=delete是C++11引入的一个新的关键字,它用于显式地删除一个已经定义的函数或操作符来阻止拷贝。

2023-11-23 00:02:03 581

原创 【C++11】auto与decltype关键字使用详解

auto和decltype是C++11引入的俩个重要的新关键字,用于在编译期自动推导出变量或表达式的类型。极大提高代码的可读性和简洁性,并且有助于减少类型转换错误。在不影响代码可读性的前提下可以尽可能的使用auto。复杂类型用auto,但是简单内置类型就没有必要使用auto了。总之避免过度使用auto和decltype,以保持代码的可读性和维护性。

2023-11-22 23:32:19 100

原创 【C++11】右值引用使用详解

C++11右值引用使用详解

2023-11-21 00:15:24 230

原创 【C++11】Lambda表达式使用详解

Lambda表达式使用详解

2023-11-20 23:31:27 271

原创 【C++11】weak_ptr智能指针使用详解

在C++编程中,处理循环引用是一个常见的问题。循环引用可能导致内存泄漏和资源管理问题。为了解决这个问题,C++11引入了weak_ptr智能指针。弱指针(weak_ptr)是一种不受控制所指向对象生存期的智能指针,它指向由一个shared_ptr管理的对象。允许你共享对象的所有权,但不会增加对象的引用计数。它是一种弱引用,不会阻止对象的销毁。一旦一个指向对象的shared_ptr被销毁,对象就会被释放。即使有weak_ptr指向对象,对象也会被释放。

2023-11-17 16:37:06 576

原创 【C++11】unique_ptr智能指针使用详解

C++11 unique_ptr智能指针使用详解

2023-11-17 15:28:36 954

原创 【C++11】shared_ptr智能指针使用详解

shared_ptr智能指针使用详解

2023-11-16 00:17:29 823

原创 【C++11】智能指针与动态内存

C++11智能指针介绍

2023-11-13 23:47:03 69

原创 Windows上基于Tesseract OCR5.0官方语言库的LSTM字库训练

Windows上基于Tesseract OCR5.0进行LSTM字库训练

2023-11-10 17:18:18 1684 2

原创 C++实例 调用Tesseract OCR的API

Tesseract OCR C++的API调用实例

2023-11-10 10:49:19 1799

原创 Windows下Tesseract OCR引擎库的编译和下载

网上很多关于Tesseract OCR下载和编译的博客都已经过时了,按照其方法并不能成功。这里以最新的官方文档为基础,记录Tesseract OCR的下载和编译经历。

2023-11-09 16:14:19 1105

原创 通过GFlags工具来复现因为野指针、内存越界等造成的程序崩溃

通过GFlags工具来复现因为野指针、内存越界等造成的程序崩溃

2023-11-06 17:21:43 556

原创 C++程序崩溃时,使用Windbg静态分析dump文件

C++程序崩溃时,使用Windbg静态分析dump文件

2023-11-06 14:27:05 1003

原创 C++程序崩溃时,使用Visual Studio静态分析dump文件

通过Visual Studio静态分析Dump文件

2023-10-25 13:53:20 2110

原创 如何在 Visual Studio 中用GoogleTest编写 C/C++ 单元测试

Visual Studio 包含下面这些 C++ 测试框架,无需进行额外下载:适用于 C++ 的 Microsoft 单元测试框架Google TestBoost.TestCTestMicrosoft 单元测试框架项目添加后,VS2017编译不过,据说是VS的Bug,在最新的版本已经修复。由于没有最新VS,这里不再讲述。错误 C1083 无法打开包括文件: “CppUnitTest.h”: No such file ordirectory NativUnitTest d:\project

2021-12-30 16:11:18 3651 1

原创 Unicode编码的四字节字符的判断方法

uff-16存储的4字节字符的判断方法

2020-10-20 15:16:16 782

原创 调试C++托管进程(clr)不能命中断点或不能查看变量在堆栈中的值

C++程序调用托管进程,在C++程序或者托管进程中打断点debug调试,有可能出现断点不能命中,或者不能实时查看变量在堆栈的值。

2020-04-10 13:06:15 555

原创 快速排序

快速排序被列为20世纪十大算法之一。 基本思想是:选取一个枢轴,通过一趟排序将待排记录分割成独立的俩部分,其中一部分记录比枢轴小,另外一部分记录比枢轴大;然后再继续对分割好的的字序列进行上述排序。实现代码void swap(int *a, int low, int high){ int temp = a[low]; a[low] = a[high]; a[high] =

2017-08-31 15:09:21 214

原创 有序表查找——折半查找,又为二分法

折半查找,又为二分法前提:线性表中的记录为有序的(一般是从小到大)基本思想:在有序表中,取中间值和要查找的值比较 若等于中间值,则中间值即为要查找的 若小于中间值,则中间值的左半区域继续查找 若大于中间值,则中间值的右半区域继续查找 不断重复上述过程int Binary_Search(int *a, int len, int key){ int left = 0;

2017-08-29 17:02:22 1986

转载 C++ 多态 (纯)虚函数 虚函数表解析

多态 定义: 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数原理: C++多态性是通过虚函数来实现的 多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。作用: 那么多态的作用是什么呢,封

2017-08-16 14:39:11 1117

原创 用内核对象进行线程同步——信号量内核对象

信号量内核对象包含一个使用计数,还有另外俩个32位值:一个最大资源计数,一个当前资源计数。 最大资源计数表示信号量可以控制的最大资源数量,即可以同时调度的最大线程数;当前资源计数表示信号量当前可用资源的数量,即当前可调度的线程数。信号量规则: 1. 当前资源计数 > 0, 信号量处于触发状态 2. 当前资源计数 = 0, 信号量处于未触发状态 3. 系统绝不会让当前资源计数 < 0

2017-08-09 19:03:54 400

原创 用内核对象进行线程同步——互斥量内核对象

互斥内核对象用来确保一个线程独占对一个资源的访问。互斥亮和关键段的的行为完全相同,但关键段是用户模式下的同步对象,意味着互斥量比关键段慢。创建互斥量// bInitialOwner// FALSE:互斥量不为任何线程所占用,处于触发状态; // TRUE:互斥量被调用线程线程所占用,处于未触发状态HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lp

2017-08-09 15:03:46 239

原创 用内核对象进行线程同步——事件内核对象

事件内核对象 1. 手动重置事件:当一个手动重置事件被触发的时候,所有等待该事件的线程都变为可调度状态。所以要注意此时所有的线程都只能以只读的方式来访问内存,这也是多个线程能够同时运行的唯一原因 2. 自动重置事件:当一个自动重置事件被触发的时候,只有一个等待该事件的线程都变为可调度状态(当线程成功等到事件触发的时候,会自动的把事件重置为未触发状态),其余的继续等待。创建一个事件内核对象HA

2017-08-09 11:04:16 282

原创 用户模式下的线程同步——Slim读/写锁

SRWLock的目的和关键段一样,但不同的是SRWLock可以区分哪些线程要读取共享资源,哪些要更新共享资源。读取共享资源的线程因为不会破坏共享资源的数据,故这些线程可以同时读取同一共享资源,但要更新共享资源的线程必须独占共享资源,此时读取线程也没有权限访问共享资源。更新线程: 1.定义一个SRWLOCk结构,并用InitializeSRWLock函数对它进行初始化:VOID Initialize

2017-08-08 16:58:03 282

原创 用户模式下的多线程同步——关键段

关键段使线程访问共享资源之前独占它,共享资源访问结束后线程释放对资源的独占。但是这个过程中,系统也可能暂停该线程取调度其他线程,但是,在关键段释放之前,不会调度其他想访问同一资源的线程。#include "stdafx.h"#include <windows.h> #include <process.h> #include <iostream>using namespace

2017-08-08 14:58:26 143

原创 用户模式下的多线程同步——原子访问(Interlocked系列函数)

下面这段代码,通过俩个线程改变一个全局变量的值,咋一看,没什么问题,g_x通过每个线程都自增1,最后g_x的值为2。但实际上有多个线程改变共享变量的值时,如果不加其他任何操作,是很危险的,最后共享变量的值往往不可预见。 简单分析下原因 我们期待的执行顺序是: Thread1. g_x把值(0)存在寄存器中 Thread1. 寄存器值加1变为1 Thread1. 把1存放回到g_x Thr

2017-08-08 13:38:59 287

原创 C++ 单例设计模式

有些类只需要有一个实例,比如软件开发过程中的日志功能,因为我们要频繁的写log,不可能每次都要重新new一个日志实例,然后用完再delete。当然在C++中可以用全局变量来代替,但全局变量有太多的不可预测性,特别是在多线程的开发中,所以对全局变量我们是能不用就不用。此时单例设计模式就派上用场了。先上代码,在分析为何这么写。// Singleton.h#pragma once#include <w

2017-08-04 18:00:09 361

原创 指针传值易注意点

struct _ClassA { int x; int y;}ClassA, PCLassAFun(ClassA *p){ ClassA a; a.x = 1; a.y = 2; p = &a; }// 调用Fun后,会发现p指针还是指向NULLClassA *p = NULL;Fun(p);p指针还是指向NULL,原因如下: 传进函数

2017-08-02 18:04:11 225

原创 C++构造函数初始化列表

class Test{public: // const型数据成员初始化的唯一方法 Test():z(0), d(1) { x = 2; y = 3; };private: int x; int y; const int z; const int d;};

2017-07-18 17:53:24 177

原创 拷贝构造函数

拷贝构造函数创建一个新的对象,此对象是另外一个对象的复制品:将原对象的数据成员逐一赋值给目标对象相应的数据成员。没有的话会自动生成一个默认构造函数。// 原型(参数类型必须是引用)Person(Person&);或Person(const Person&);// 如果有多个参数,第一个参数以后的所有参数必须有默认值或Person(const Person&, bool married = f

2017-07-18 16:59:46 239

原创 C++ 面向对象编程提高代码的效率性和健壮性

一、通过引用来传递和返回对象和其他变量一样,对象既可以通过传值方式,也可以通过引用方式来传递和返回。一般来说,除非迫不得已,都采用引用方式。这是因为通过传值方式来传递和返回对象需要面临对象间的拷贝操作,是数据变大,从而降低效率,浪费内存。(传递一个指向对象的指针与引用方式效果相同)class Test{public: void set(int n) { nNum = n; };

2017-07-17 11:42:10 785

原创 64位进程和32位进程通信问题,接收方接收到的数据错误

64位程序向32位程序发送一个WM_COPYDATA消息, 发现传递的数据和收到的数据不一致

2017-01-10 17:30:19 6099 1

原创 C++ 输出文字到csv文件 乱码问题

要写一个utf-8的文件头,然后输入到csv文件开头,如下TCHAR wszUTF_8BOM[4] = {(TCHAR)0xEF, (TCHAR)0xBB, (TCHAR)0xBF, 0};

2016-09-27 19:09:12 4592

转载 移动端手指上下滑动切换插件pageSlider

转载于(下载该插件): http://www.jq22.com/jquery-info8395###PageSlider 是一个基于zepto.js用于实现H5单页面跟随手指上下滑动切换的组件,支持通过transform3D启动GPU加速,目前仅支持移动端touch设备。支持浏览器: Chrome、Firefox、Safari、IE10及以上用法 HTML结构<!DOCTYPE html><ht

2016-09-12 15:03:36 4331 4

原创 setInterval、setTimeout不能传递带参数

解决办法:匿名函数包装, 既可以周期性执行foo(id)这个函数,而且把变量id传递进去了window.setInterval(function() { foo (id);}, 1000);

2016-09-09 18:25:41 239

空空如也

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

TA关注的人

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