- 博客(235)
- 收藏
- 关注
原创 带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
原创 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
原创 【编码实战】MSVC处理代码文件优先级
摘要:MSVC编译器处理代码文件时,BOM标识对源字符集(source_character_set)的优先级高于#pragma指令。
2026-01-25 22:08:02
498
原创 【编码实战】源文件不同编码控制台输出过程
摘要:在Windows VS环境中,带BOM的UTF-8代码文件能正确输出中文的关键在于BOM会触发编译器将source_character_set设为UTF-8(而非默认GBK)。
2026-01-25 21:54:49
507
原创 std::sort排序过程
C++的std::sort并非通过相邻元素两两比较实现,而是采用高效的内省排序算法(结合快速排序、堆排序和插入排序)。
2026-01-24 10:25:36
483
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅