自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Git Clone

git clone介绍

2026-02-03 16:25:39 520

原创 带BOM的UTF-8文件会产生文件级source-charset

摘要:带BOM的UTF-8文件和/source-charset:utf-8编译参数虽都能解决MSVC的"常量中有换行符"报错,但机制不同。前者通过文件头BOM隐式触发UTF-8解码,后者显式强制指定编码。BOM方案仅影响单个文件,跨平台兼容性差;编译参数作用于整个项目,优先级更高,推荐使用无BOM UTF-8文件配合/utf-8参数实现最佳跨平台支持。两种方案本质都是绕过系统默认GBK编码,但并非等价关系。

2026-02-03 15:31:34 407

原创 static成员计数会有污染无法替换外部计数结构体

将引用计数设为静态成员变量无法实现shared_ptr的功能,因为静态成员属于整个类,所有对象共享同一计数,导致不同资源的计数互相干扰。测试显示,管理不同资源的指针会错误共享计数,引发内存泄漏和资源释放失效。正确做法是使用堆分配的独立计数(int*),确保每组资源有专属的引用计数。静态成员仅适用于全局统计场景,与shared_ptr的资源级共享需求根本冲突。

2026-02-03 15:01:35 635

原创 int * 代替外部计数结构体实现SharedPtr

摘要:不能将引用计数直接作为SharedPtr类的普通int成员变量,因为普通成员变量属于对象独占,无法实现多个智能指针共享同一计数的需求。正确做法是将计数分配在堆内存中,通过指针共享。错误实现会导致计数隔离、重复释放或内存泄漏。最简方案可用int*替代结构体实现基础功能,结构体仅用于扩展场景。核心原则:计数必须存储在堆上并通过指针共享。

2026-02-03 14:54:41 292

原创 独立简化版SharedPtr

本文提供了一个独立、精简的SharedPtr智能指针实现,移除了所有与WeakPtr相关的代码。核心特性包括:1)仅维护强引用计数;2)实现构造/析构、拷贝/移动、重置等核心功能;3)当强引用归零时自动释放资源。代码结构清晰,包含引用计数结构体、SharedPtr类实现和测试用例,可独立编译运行。重点解释了引用计数规则和关键函数,如release()统一处理资源释放,移动语义高效转移所有权等。该实现保留了shared_ptr的核心功能,适合单独学习和使用。

2026-02-03 14:04:49 201

原创 SharedPtr测试步骤说明

本文详细解析了自定义SharedPtr智能指针的测试函数执行过程。通过逐行分析构造、拷贝、移动和reset操作,展示了引用计数变化和内存状态。关键点包括:1) 拷贝构造共享资源时计数+1;2) 移动构造转移所有权时计数不变;3) reset会释放旧资源并绑定新对象;4) 引用计数为0时自动释放内存。测试验证了SharedPtr能正确管理资源生命周期,避免内存泄漏,体现了智能指针的核心机制。

2026-02-02 22:02:06 625

原创 unique_ptr、shared_ptr、weak_ptr简易版实现记录

本文介绍了C++智能指针的实现原理与代码实现。通过RAII机制管理资源生命周期,分别实现了独占式智能指针(unique_ptr)、共享式智能指针(shared_ptr)和弱引用智能指针(weak_ptr)。unique_ptr禁止拷贝仅支持移动,实现资源独占;shared_ptr通过引用计数实现资源共享;weak_ptr作为观察者解决循环引用问题。文章详细展示了各类智能指针的核心代码实现,包括构造函数、析构函数、移动/拷贝操作等关键方法,并解释了引用计数的管理机制。该实现可作为理解智能指针工作原理的参考示例

2026-02-02 22:00:41 283

原创 MyUniquePtr解引用运算符operator*和箭头运算符operator->

本文展示了如何为自定义智能指针MyUniquePtr重载解引用运算符operator*和箭头运算符operator->,并通过完整测试案例验证其功能。关键点包括: operator*返回对象引用,支持*ptr直接访问对象成员; operator->返回裸指针,实现ptr->member的简洁语法; 测试案例通过Person类验证了两种运算符的读写操作,包括成员函数调用和变量访问。运行结果清晰展示了智能指针自动管理生命周期的特性,最终在析构时正确释放资源。

2026-01-31 22:39:32 846

原创 简化版unique_ptr说明其本质

摘要:独占指针(unique_ptr)的核心实现基于禁用拷贝构造/赋值运算符,并实现移动构造/移动赋值,通过资源所有权转移实现独占性。其原理包括:1)构造函数接管裸指针所有权;2)禁用拷贝保证独占;3)移动构造/赋值转移所有权并置空原对象;4)析构函数自动释放资源(RAII机制);5)重载运算符模拟指针行为。伪代码展示了模板类如何通过=delete禁用拷贝,用右值引用实现移动语义,确保资源唯一所有权且可安全转移,体现了移动语义是独占指针实现的关键。

2026-01-31 21:27:21 677

原创 WideCharToMultiByte与T2A

摘要:MFC程序中使用T2A宏转换CString到std::string时出现中文乱码,导致find("要素代码")查找失败。问题根源在于T2A隐式依赖系统ANSI编码(如GBK),与程序编码不匹配。解决方案是采用WideCharToMultiByte函数显式指定编码(推荐UTF-8),并封装安全的转换函数CStringToString。关键点包括:使用u8前缀确保字符串编码一致,设置控制台输出编码为UTF-8,以及优先选择UTF-8编码保证跨平台兼容性。通过显式控制编码转换,可彻底解决

2026-01-31 21:15:42 245

原创 wchar_t与_T()

摘要:该问题源于字符串常量const wchar_t*类型无法直接赋值给非const指针ZTCHAR*。解决方案推荐优先采用添加const修饰(const ZTCHAR*)保证类型安全;若必须使用非const指针,可通过const_cast强制转换,但需确保不修改字符串内容以避免未定义行为。

2026-01-31 21:10:25 439

原创 智能指针使用场景

C++智能指针通过RAII机制自动管理内存,解决裸指针的常见问题。C++11提供了三种智能指针:unique_ptr(独占所有权,轻量高效)、shared_ptr(共享所有权,引用计数)和weak_ptr(弱引用,解决循环引用)。选择原则是优先使用unique_ptr,仅在需要共享时用shared_ptr。unique_ptr适用于工厂模式、类成员资源管理、多态容器等场景;shared_ptr用于共享资源或跨作用域共享对象;weak_ptr主要解决shared_ptr的循环引用问题。

2026-01-30 23:42:43 798

原创 /execution-charset:与#pragma execution_character_set

本文分析了MSVC编译器字符集配置的注意事项。

2026-01-30 22:53:43 904

原创 MSVC单独配置源字符集、执行字符集

摘要:本文详细介绍了在MSVC编译器中单独配置源字符集和执行字符集的方法。通过定义核心参数(/source-charset和/execution-charset),分别说明它们在解析源文件和编译后存储字符串时的作用。文章提供了两种配置方式:VS图形界面操作和命令行/CMake/qmake脚本化配置,并给出常见场景的配置示例(如GBK源文件转UTF-8执行字符集)。最后强调编码名称规范、配置优先级以及与QStringLiteral的配合注意事项,推荐统一使用UTF-8编码以避免兼容问题。

2026-01-30 22:20:47 806

原创 Visual Studio不改变文件编码情况下解决C2001

本文针对Visual Studio中Qt项目源文件设置为无BOM UTF-8编码时出现的C2001编译错误,提供了解决方案。关键点在于强制VS正确识别无BOM UTF-8文件:通过项目属性添加/utf-8编译选项,从根源解决源字符集解析问题。同时指出#pragma execution_character_set仅影响执行字符集,无法解决该错误。最终方案需配合控制台UTF-8编码设置,确保中文输出无乱码,满足无BOM UTF-8编码的测试需求。

2026-01-30 19:16:49 573

原创 编码体系导致的Qt Creator预览区别

文章摘要: 在Qt Creator中修改源文件编码时,将UTF-8改为GBK仅导致中文乱码但程序能运行,而改为UTF-16/UTF-32则直接报错且源码全乱。

2026-01-30 17:06:50 953

原创 Qt Creator中修改源文件编码

摘要: Qt Creator支持修改文件编码,可通过查看当前编码→单文件转换(3种方式)或全局设置(默认编码)操作。

2026-01-30 16:55:57 254

原创 auto product = createProduct();合法性

摘要:unique_ptr禁止拷贝但允许移动语义,函数返回的临时unique_ptr(右值)会触发移动构造或返回值优化,而非拷贝操作。auto product = createProduct()合法是因为函数返回的右值通过移动语义转移所有权。显式拷贝具名unique_ptr会编译失败,必须用std::move转移所有权。C++14的make_unique比直接new更安全高效。unique_ptr通过禁用拷贝、支持移动实现了独占所有权与灵活转移的平衡。(149字)

2026-01-29 11:19:30 406

原创 【QString】chop无边界问题

摘要: Qt的QString::chop(int n)方法在字符串为空或长度小于n时不会崩溃,而是清空字符串;仅当n ≤ 0时不执行操作。

2026-01-29 11:07:23 308

原创 浮点数精度限制与对数函数

摘要:本文分析了一个C++开发中遇到的浮点数精度问题,当a略大于1时,y=a^x的反函数计算无法正确返回预期整数结果(如x=0,1,2)。

2026-01-29 10:44:39 303

原创 lock_guard和手动加锁下的try-catch 的作用域范围

本文通过对比两种多线程加锁方式的异常处理机制,揭示了try-catch作用域对程序执行流程的关键影响。当try包裹整个循环时(incrementManual),异常会终止线程的后续执行,导致5个线程各执行500次计数,总计2500次;而当try仅包裹单次迭代时(incrementGuard),异常被捕获后循环继续,每个线程执行999次,总计4995次,显著偏离预期值2500。结果表明,异常处理的作用域范围会直接影响多线程程序的最终输出,而lock_guard本身的安全性不受try位置影响。

2026-01-29 10:16:33 590

原创 手动加锁解锁版本catch里解锁结果正确分析

本文通过多线程程序示例分析手动加锁解锁的风险,对比推荐使用std::lock_guard的RAII机制。实验显示,手动在catch块解锁虽能避免死锁,但存在三大隐患:1)多退出路径导致解锁遗漏;2)try块外异常无法捕获;3)catch块内再抛异常跳过解锁。而lock_guard通过构造/析构自动管理锁生命周期,能可靠处理所有异常和退出路径,是C++中更健壮的互斥锁管理方案。

2026-01-29 09:33:45 513

原创 两版本锁抛出异常测试

摘要:本文对比了C++中手动调用std::mutex与使用std::lock_guard的差异。手动加锁在临界区抛出异常时会跳过unlock()导致死锁,而lock_guard基于RAII机制能自动解锁。

2026-01-28 23:09:24 283

原创 线程函数中抛出的未捕获异常

摘要:本文分析了多线程程序中因异常处理不当导致崩溃的原因。当线程函数抛出未捕获异常时,会触发std::terminate()使程序终止,主线程的try-catch无法拦截跨线程异常。

2026-01-28 22:39:55 297

原创 std::mutex与std::lock

本文详细介绍了C++11中std::mutex和std::lock的使用方法。

2026-01-28 22:36:54 449

原创 多线程锁基础

本文介绍了C++多线程编程中常用的锁机制

2026-01-28 22:02:00 551

原创 异步不必须依赖多线程

文章摘要: 异步和多线程分别从宏观(程序逻辑/用户体验)和微观(资源调度/代码执行)层面解决非阻塞问题。

2026-01-28 19:44:44 622

原创 异步和多线程

摘要:异步和多线程是不同维度的概念,异步是编程模型(非阻塞执行),多线程是资源调度方式(并发执行)。

2026-01-28 19:37:18 583

原创 QGSTask 是什么

QGSTask 多线程框架在 QGIS 二次开发中的应用 QGSTask 是 QGIS 内置的异步任务处理框架,用于解决 GIS 操作中的耗时任务问题。

2026-01-27 22:43:29 608

原创 多线程开篇记录几个例子

本文介绍了C++多线程编程的核心注意事项及两个典型示例。关键点包括:线程创建与销毁管理(必须调用join或detach)、数据竞争防范(互斥锁/原子操作/条件变量)、死锁避免策略、参数传递方式及资源生命周期控制等。通过两个示例展示了基础多线程用法(函数、类成员、lambda表达式)和共享资源同步方案(未加锁导致的数据竞争错误vs加锁后的正确结果),并对比了互斥锁与原子操作的性能差异。

2026-01-27 21:45:01 615

原创 【字符编码】无BOM的UTF-8双重错误抵消

摘要:在Windows VS环境中,std::cout输出中文乱码时,仅修改控制台编码能解决问题是因为编译器默认用GBK解码无BOM UTF-8源文件(错误1),再用GBK编码(错误2),两次错误抵消使程序仍输出UTF-8字节

2026-01-27 08:49:51 630

原创 【字符编码】源文件编码对应source-charset、execution-charset

摘要: 在VS中,source-charset和execution-charset的默认值取决于源文件编码和系统环境。

2026-01-26 21:35:50 535

原创 【字符编码】源文件编码与字符字节序列

摘要:源文件编码决定了常量字符串的实际存储字节序列。

2026-01-26 21:08:18 526

原创 【编码实战】编译器解码编码过程

拆解编译器处理字符字节序列解码和编码过程

2026-01-25 22:19:26 505

原创 【编码实战】MSVC处理代码文件优先级

摘要:MSVC编译器处理代码文件时,BOM标识对源字符集(source_character_set)的优先级高于#pragma指令。

2026-01-25 22:08:02 498

原创 【编码实战】源字符集设置

摘要:在VS中无法通过#pragma source_character_set指令直接设置源字符集,该写法无效。

2026-01-25 22:05:52 607

原创 【编码实战】源文件不同编码控制台输出过程

摘要:在Windows VS环境中,带BOM的UTF-8代码文件能正确输出中文的关键在于BOM会触发编译器将source_character_set设为UTF-8(而非默认GBK)。

2026-01-25 21:54:49 507

原创 【编码实战】当前代码页 936 无法表示的字符

摘要(149字): 测试发现中文字符输出报错与字符数奇偶性相关

2026-01-25 20:26:02 659

原创 sort函数 + lambda表达式

本文详细解析了C++中使用lambda表达式对索引数组进行间接排序的过程。

2026-01-24 10:30:55 566

原创 std::sort排序过程

C++的std::sort并非通过相邻元素两两比较实现,而是采用高效的内省排序算法(结合快速排序、堆排序和插入排序)。

2026-01-24 10:25:36 483

空空如也

空空如也

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

TA关注的人

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