VS2022+Qt+OpenCV Debug模式下,循环中格式转换引起的内存异常问题 debug_heap.cpp

news2024/10/6 8:33:14

文章目录

  • 前言
  • 一、问题
  • 二、报错
    • 1.提示图片
    • 2.提示堆栈
    • 3.反汇编位置
  • 三、解决办法
  • 总结


前言

最近在使用VS2022,C++,OpenCV,Qt开发时,遇到了一个疑难杂症-在循环中执行字符串格式转换会触发内存异常,经过痛苦的排查过程,终于解决了,现将问题及解决办法分享出来。


一、问题

当在使用VS2022,C++,OpenCV,Qt联合开发时,触发了一个只有在Debug模式下才出现的断点问题,十分耽误正常的测试工作:
精简一下描述就是:在循环中执行字符串格式转换会触发内存异常。例如:


		for (int l(0); l < 16; l++)//不循环反而很少能出问题,一循环就炸了
		{
			//在循环中执行以下代码1
			QString height_str1 = QString::number(1.111, 'f', 2);
			std::string height_str_std1 = height_str1.toStdString();
			
			//或在循环中执行以下代码2
			cv::String get_c_str = cv::format("%.0d", 1);
		}

都会触发debug内存自检,停止在反编译为:int 3的位置。导致程序无法正常执行

二、报错

1.提示图片

1

2.提示堆栈

点击重试后,提示: 【项目执行文件名.exe】!free_dbg_nolock(void * const block, const int block_use) 行 XXX C++

3.反汇编位置

— minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp -------------------------
00007FF7DEDEB32B pop rbp
00007FF7DEDEB32C add byte ptr [rbx+5C8C8105h],cl
00007FF7DEDEB332 add byte ptr [rbx-3F7AFD20h],al
00007FF7DEDEB338 jne free_dbg_nolock+72Ch (07FF7DEDEB45Ch)
00007FF7DEDEB33E mov rax,qword ptr [header]
00007FF7DEDEB343 cmp qword ptr [rax],0
00007FF7DEDEB347 je free_dbg_nolock+630h (07FF7DEDEB360h)
00007FF7DEDEB349 mov rax,qword ptr [header]
00007FF7DEDEB34E mov rax,qword ptr [rax]
00007FF7DEDEB351 mov rcx,qword ptr [header]
00007FF7DEDEB356 mov rcx,qword ptr [rcx+8]
00007FF7DEDEB35A mov qword ptr [rax+8],rcx
00007FF7DEDEB35E jmp free_dbg_nolock+688h (07FF7DEDEB3B8h)
00007FF7DEDEB360 mov rax,qword ptr [header]
00007FF7DEDEB365 cmp qword ptr [__acrt_last_block (07FF7DF3BC828h)],rax
00007FF7DEDEB36C je free_dbg_nolock+678h (07FF7DEDEB3A8h)
00007FF7DEDEB36E lea rax,[string L"__acrt_last_blo\x4000\0\0\0\0"… (07FF7DF28C9F0h)]
00007FF7DEDEB375 mov qword ptr [rsp+28h],rax
00007FF7DEDEB37A lea rax,[string L"%ls" (07FF7DF273288h)]
00007FF7DEDEB381 mov qword ptr [rsp+20h],rax
00007FF7DEDEB386 xor r9d,r9d
00007FF7DEDEB389 mov r8d,3DAh
00007FF7DEDEB38F lea rdx,[string L"minkernel\crts\\x4000\0\0\0\0"… (07FF7DF28BE50h)]
00007FF7DEDEB396 mov ecx,2
00007FF7DEDEB39B call _CrtDbgReportW (07FF7DE71B544h)
00007FF7DEDEB3A0 cmp eax,1
00007FF7DEDEB3A3 jne free_dbg_nolock+678h (07FF7DEDEB3A8h)
00007FF7DEDEB3A5 int 3
00007FF7DEDEB3A6 xor eax,eax
00007FF7DEDEB3A8 mov rax,qword ptr [header]
00007FF7DEDEB3AD mov rax,qword ptr [rax+8]
00007FF7DEDEB3B1 mov qword ptr [__acrt_last_block (07FF7DF3BC828h)],rax
00007FF7DEDEB3B8 mov rax,qword ptr [header]
00007FF7DEDEB3BD cmp qword ptr [rax+8],0
00007FF7DEDEB3C2 je free_dbg_nolock+6AAh (07FF7DEDEB3DAh)
00007FF7DEDEB3C4 mov rax,qword ptr [header]
00007FF7DEDEB3C9 mov rax,qword ptr [rax+8]
00007FF7DEDEB3CD mov rcx,qword ptr [header]
00007FF7DEDEB3D2 mov rcx,qword ptr [rcx]
00007FF7DEDEB3D5 mov qword ptr [rax],rcx
00007FF7DEDEB3D8 jmp free_dbg_nolock+701h (07FF7DEDEB431h)
00007FF7DEDEB3DA mov rax,qword ptr [header]
00007FF7DEDEB3DF cmp qword ptr [__acrt_first_block (07FF7DF3BC818h)],rax
00007FF7DEDEB3E6 je free_dbg_nolock+6F2h (07FF7DEDEB422h)
00007FF7DEDEB3E8 lea rax,[string L"__acrt_first_bl\x4000\0\0\0\0"… (07FF7DF28CA38h)]
00007FF7DEDEB3EF mov qword ptr [rsp+28h],rax
00007FF7DEDEB3F4 lea rax,[string L"%ls" (07FF7DF273288h)]
00007FF7DEDEB3FB mov qword ptr [rsp+20h],rax
00007FF7DEDEB400 xor r9d,r9d
00007FF7DEDEB403 mov r8d,3E4h
00007FF7DEDEB409 lea rdx,[string L"minkernel\crts\\x4000\0\0\0\0"… (07FF7DF28BE50h)]
00007FF7DEDEB410 mov ecx,2
00007FF7DEDEB415 call _CrtDbgReportW (07FF7DE71B544h)
00007FF7DEDEB41A cmp eax,1
00007FF7DEDEB41D jne free_dbg_nolock+6F2h (07FF7DEDEB422h)
00007FF7DEDEB41F int 3 ----------------------------------------停在这里

三、解决办法

也就是别用这个Qt 自带的格式转换,他会操作内存,谁知道会有啥问题
代码如下:

		for (int l(0); l < 16; l++)
		{
			//在循环中执行以下代码1 变换为
			cv::String get_c_str = cv::format("%.0d", 1);
			std::string height_str1  = QString("%1").arg(QString::number(1.111,'f',2)).toLocal8Bit().constData();
			//在循环中执行以下代码2 变换为 opencv也支持这个输入,凑合用吧
			std::string get_str = QString("%1").arg(QString::number(1)).toLocal8Bit().constData();
			const char* get_c_str = get_str.c_str();
		}

这样就行了


总结

以上为开发中的一个疑难杂症,具体原因我到现在也不清楚,希望如果有知道原因,或者有更好解决办法的同志们,分享你们的解决办法。提点一下我,到底因为啥。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1887419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu下反弹shell的思考

目录 Ubuntu的命令执行环境 bash (Bourne Again SHell): sh (Bourne SHell): dash (Debian Almquist SHell): 它们之间的关系&#xff1a; 可能遇到的问题 一、脚本权限问题 二、命令执行环境(shell解释器)问题 如何解决&#xff1f; 1.修改/bin/sh软连接的指向为bas…

C++字体库开发

建议根据字体需求&#xff0c;多个组合使用。高度定制可基于freeTypeharfbuzz基础库完成。 GitHub - GNOME/pango: Read-only mirror of https://gitlab.gnome.org/GNOME/pango GitHub - googlefonts/fontview: Demo app that displays fonts with a free/libre/open-source …

Java_多线程:线程和死锁

一、线程 1、线程的状态流转 新建状态&#xff08;New&#xff09;&#xff1a;当线程对象对创建后&#xff0c;即进入了新建状态&#xff0c;如&#xff1a;Thread t new MyThread();就绪状态&#xff08;Runnable&#xff09;&#xff1a;当调用线程对象的start()方法&…

JAVA极简图书管理系统,初识springboot后端项目

前提条件&#xff1a; 具备基础的springboot 知识 Java基础 废话不多说&#xff01; 创建项目 配置所需环境 将application.properties>application.yml 配置以下环境 数据库连接MySQL 自己创建的数据库名称为book_test server:port: 8080 spring:datasource:url:…

搜索型数据库的技术发展历程与趋势前瞻

概述 随着数字科技的飞速发展和信息量的爆炸性增长&#xff0c;搜索引擎已成为我们获取信息的首选途径之一&#xff0c;典型的代表厂商如 Google。然而&#xff0c;随着用户需求的不断演变&#xff0c;传统的搜索技术已经无法满足人们对信息的实时性、个性化和多样性的需求。 …

C++基础知识-编译相关

记录C语言相关的基础知识 1 C源码到可执行文件的四个阶段 预处理(.i)、编译(.s)、汇编(.obj)、链接。 1.1 预处理 预处理阶段&#xff0c;主要完成宏替换、文件展开、注释删除、条件编译展开、添加行号和文件名标识&#xff0c;输出.i/.ii预处理文件。 宏替换&#xff0c;…

AI的价值——不再那么“废”人,保险行业用AI人员流失减少20%

最近有个热点挺让人唏嘘的&#xff0c;某咖啡店员工对顾客泼咖啡粉&#xff0c;我们对于这个事件不予评价。但是对员工这种情绪崩溃&#xff0c;我们所接触的行业中也有不少例子&#xff0c;比如保险行业&#xff0c;相信大家经常会被打保险电话&#xff0c;这类电话很容易就被…

K8s 的最后一片拼图:dbPaaS

K8s 的发展使得私有云跟公共云之间的技术差不断的缩小&#xff0c;不管是在私有云还是公共云&#xff0c;大家今天都在基于 K8s 去开发 PaaS 系统。而 K8s 作为构建 PaaS 的基础&#xff0c;其全景图里还缺最后一块“拼图”——dbPaaS。作为一个云数据库行业干了十几年的资深从…

Swin Transformer:最佳论文,准确率和性能双佳的视觉Transformer | ICCV 2021

论文提出了经典的Vision Transormer模型Swin Transformer&#xff0c;能够构建层级特征提高任务准确率&#xff0c;而且其计算复杂度经过各种加速设计&#xff0c;能够与输入图片大小成线性关系。从实验结果来看&#xff0c;Swin Transormer在各视觉任务上都有很不错的准确率&a…

哈尔滨如何选择合适的等保测评机构?

选择合适的等保测评机构确实需要细致考虑&#xff0c;您提到的八个方面已经非常全面&#xff0c;涵盖了资质、专业能力、服务质量和合规性等多个关键点。为了进一步确保所选机构的可靠性&#xff0c;还可以考虑以下几点&#xff1a; 1.技术创新与工具&#xff1a;了解测评机构是…

UE5的安装与基本操作(一)

文章目录 前言安装UE5新建第一个游戏项目基本游览方式对目标进行变换各种变换对齐 快速定位目标 总结 前言 Unreal Engine 5 (UE5) 是一款由 Epic Games 开发的实时 3D 创作平台&#xff0c;用于制作游戏、电影、动画、建筑可视化和其他类型的交互式体验。UE5 提供了一系列强大…

解锁IDEA中Git/SVN Issue Navigation功能:80%程序员都不懂的秘密武器~

文章目录 前言什么是 Git Issue Navigation&#xff1f;配置 Git Issue Navigation1. 打开设置2. 导航到 Issue Navigation 设置3. 添加新的 Issue Navigation 规则具体示例配置 使用 Git Issue Navigation在提交信息中使用 Issue ID实际导航到连接 优点1. 快速定位问题2. 提高…

可重入锁思想,设计MQ迁移方案

如果你的MQ消息要从Kafka切换到RocketMQ且不停机&#xff0c;怎么做&#xff1f;在让这个MQ消息调用第三方发奖接口&#xff0c;但无幂等字段又怎么处理&#xff1f;今天小傅哥就给大家分享一个关于MQ消息在这样的场景中的处理手段。 这是一种比较特例的场景&#xff0c;需要保…

6月28日华为云数据库斯享会上海站,NineData技术总监薛晓乐受邀并带来主题分享

6月28日&#xff08;周五&#xff09;&#xff0c;华为云数据库斯享会即将在上海举办&#xff0c;将与的开发者朋友们一起进行数据库技术交流&#xff01;NineData 技术总监薛晓乐受邀参会&#xff0c;并将带来《企业级数据库 DevOps 最佳实践》的主题分享。 本次活动议程&…

ROS2 分布式 及 ssh远程控制 和 上传文件夹

问题1. 多台计算机连接同一wifi后 &#xff0c;运行ROS2的小乌龟案例&#xff0c;自己的计算机&#xff0c;无法控制其他电脑的小乌龟 按照正常的情况来说&#xff0c;ROS2是DDS的自发现通信机制&#xff0c;只要处在同一wifi网络中&#xff0c; A计算机执行启动小乌龟的命…

Qt 配置ASan

Qt 配置ASan 文章目录 Qt 配置ASan摘要关于ASan&#xff08;AddressSanitizer&#xff09;在Qt中配置 ASan1. 安装必要的工具2. 修改项目的 .pro 文件3. 重新构建项目4. 运行应用程序5. 分析错误报告示例注意事项 关键字&#xff1a; Qt、 ASan、 AddressSanitizer 、 GCC …

DICOM灰度图像、彩色图像的窗宽、窗位与像素的最大最小值的换算关系?

图像可以调整窗宽、窗位 dicom图像中灰度图像可以调整窗宽、窗位&#xff0c;RGB图像调整亮度或对比度&#xff1f;_灰度 图 调节窗宽-CSDN博客 窗宽、窗位与像素的最大最小值的换算关系? 换算公式 max-minWindowWidth; (maxmin)/2WindowCenter; 详细解释 窗宽&#xff0…

【bug报错已解决】ERROR: Could not find a version that satisfies the requirement

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析 二、解决方法2.1 方法一2.2 方法二 三、总结 引言 有没有遇到过那种让人…

吴晓波:企业出海的最佳时间窗口只有5-10年,中国企业如何把握出海机遇?

鼓励企业参与绿色“一带一路”建设&#xff0c;带动先进的环保技术、装备、产能走出去。 出海计划&#xff01;马来西亚水环境项目国际考察暨2024中马水务合作论坛

探囊取物之多形式登录页面(基于BootStrap4)

基于BootStrap4的登录页面&#xff0c;支持手机验证码登录、账号密码登录、二维码登录、其它统一登录 低配置云服务器&#xff0c;首次加载速度较慢&#xff0c;请耐心等候&#xff1b;演练页面可点击查看源码 预览页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/pr…