2024-05-28 服务器开发-不同vs版本的std::string的访问出错问题-记录

摘要:

有一个dll库是使用vs2010编译的, 使用这个dll动态库的工程是vs2019. 这个dll动态库返回一个结构体,其中有个成员使用了std::string。但是遇到了std::string的成员显示被赋值为NULL的情况。

本文对进行分析, 重点在于追踪问题的思路。

问题描述:

  1. dll使用vs2010编译
  2. dll动态库返回一个结构体,其中有个成员使用了std::string
  3. 使用dll的工程是vs2019, 出现该std::string成员被赋值为NULL。
  4. 但是使用vs2010工程就没错误。
  5. 问题现象:

问题分析:

一. 分析该成员访问的偏移量

vs2019

vs2010

二. 对比成员 description 的访问地址偏移的分析

typedef std::string CVHString;

    CVHString						pointName;					// 测点名CVHString						interfaceName;				// 采集器名CVHString						unitName;					// 量程单位CVHString						description;				// 描述
  1. 访问pointName时候, vs2019和vs2010, 地址都是  ecx,28h  
  2. 访问description时
    1. vs2019是 edx, 70h
    2. vs2010是 edx, 7ch
  3. 两者相差16进制的C, 也就是12
  4. 中间相差三个变量,也就是 12/3 = 4
  5. vs2019的std::string,比vs2010的std::string,少了4个字节

三. vs2019的std::string相比vs2010的std::string缺少的四个字节的来源

vs2019

    union _Bxty { // storage for small buffer or pointer to larger one_CONSTEXPR20_CONTAINER _Bxty() noexcept : _Ptr() {} // user-provided, for fancy pointers_CONSTEXPR20_CONTAINER ~_Bxty() noexcept {} // user-provided, for fancy pointersvalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // TRANSITION, ABI: _Alias is preserved for binary compatibility (especially /clr)} _Bx;size_type _Mysize = 0; // current length of stringsize_type _Myres  = 0; // current storage reserved for string

vs2010

	union _Bxty{	// storage for small buffer or pointer to larger one_Elem _Buf[_BUF_SIZE];_Elem *_Ptr;char _Alias[_BUF_SIZE];	// to permit aliasing} _Bx;size_type _Mysize;	// current length of stringsize_type _Myres;	// current storage reserved for string_Alty _Alval;	// allocator object for strings

四. vs2010的std::string中的_Alty的定义

typedef typename _Alloc::template rebind<_Elem>::other _Alty;

template<class _Other>struct rebind{	// convert this type to _ALLOCATOR<_Other>typedef _ALLOCATOR<_Other> other;};pointer address(reference _Val) const{	// return address of mutable _Valreturn ((pointer) &(char&)_Val);}const_pointer address(const_reference _Val) const{	// return address of nonmutable _Valreturn ((const_pointer) &(char&)_Val);}

结论:

  1. vs2010中的std::string, 存在成员 _Alty _Alval;    // allocator object for strings
  2. 但是这个成员,在vs2019的 std::string 中,被删除了。
  3. 导致vs2019的std::string 比 vs2010的std::string 少了四个字节

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

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

相关文章

保护“第二生命线”,科技守护颈椎健康

脊柱支撑着人体重量&#xff0c;汇集着众多血管神经&#xff0c;素有“人体第二生命线”之称。在如今快节奏的时代&#xff0c;人们生活方式也在发生着变化&#xff0c;长期低头看手机、伏案久坐等不良生活习惯引发脊柱健康问题&#xff0c;且呈现年轻化趋势。目前&#xff0c;…

vue小记——上传图片小组件

个人笔记 前端&#xff1a; <template><el-uploadclass"avatar-uploader"name"image"action"http://127.0.0.1:3000/api/image/upload":show-file-list"false":headers"headerObj":data"DataForm":on-s…

【加密与解密(第四版)】第十二章笔记

第十二章 注入技术 12.1 DLL注入方法 在通常情况下&#xff0c;程序加载 DLL的时机主要有以下3个&#xff1a;一是在进程创建阶段加载输入表中的DLL&#xff0c;即俗称的“静态输人”;二是通过调用 LoadLibrary(Ex)主动加载&#xff0c;称为“动态加载”&#xff1b;三是由于系…

核心三:正确的停止线程

3、核心三&#xff1a;正确的停止线程 3.1 如何正确的停止线程 3.1.1 原理介绍&#xff1a;使用interrupt来通知&#xff0c;而不是强制 线程中断的机制&#xff1a;一个线程来通知要中断线程&#xff08;你好&#xff0c;你现在应该停止了&#xff09;最后的决定是由要中断…

第十四届蓝桥杯c++研究生组

A 关键思路是求每个十进制数的数字以及怎么在一个数组中让判断所有的数字次数相等。 求每个十进制的数字 while(n!0){int x n%10;//x获取了n的每一个位数字n/10;}扩展&#xff1a;求二进制的每位数字 &#xff08;注意&#xff1a;进制转换、1的个数、位运算&#xff09; x…

主干网络篇 | YOLOv8更换主干网络之MobileNeXt | 新一代移动端模型MobileNeXt来了!

前言:Hello大家好,我是小哥谈。MobileNeXt是由微软研究院提出的一种高效的卷积神经网络结构,它在保持模型轻量级的同时,能够获得较高的性能。MobileNeXt采用了一种称为Inverted Residuals with Linear Bottlenecks(IRL)的结构,通过深度可分离卷积和快捷连接来减少模型的…

[Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件

如下&#xff0c;我们有一个platform.pk8和platform.x509.pem。为了打包&#xff0c;需要将私钥&#xff08;.pk8&#xff09;和公钥证书&#xff08;可能是.pem或.crt文件&#xff09;合并成一个PKCS#12 格式的密钥库文件 1.准备你的私钥和证书文件 确保你有以下两个文件&…

设计模型-系统架构师(三)

1、按照《中华人民共和国著作权法》的权利保护期&#xff0c;署名权和修改权 是永久保护的。 发表权、使用权和获取报酬权 保护期限 作者终生和死后的50年。 2、&#xff08;重要&#xff09;面向对象的分析模型主要由 顶层架构图、用例与用例图和&#xff08;&#xff09;构成…

Python面试宝典:Python中与多进程编程相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第十三章:并发编程:第二节:多进程编程】 第十三章:并发编程第一节:多进程编程python中的多进程python中多线程和多进程有那些区别和联系区别1. 全局解释器锁(GIL)2. 内存共享3. 创…

2024年物理化学与工程技术发展国际会议(ICPCETD 2024)

全称&#xff1a;2024年物理化学与工程技术发展国际会议&#xff08;ICPCETD 2024&#xff09; 会议网址:http://www.icpcetd.com 会议时间: 2024.06.30 截稿时间&#xff1a;2024.06.21 会议地点: 上海 投稿邮箱&#xff1a;icpcetd_info163.com 投稿标题&#xff1a;ArticleT…

前端开发框架Angular

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Angular概述 Angular是由Google开发并维护的一款开源前端开发框架。它最初被设计为用于构建单页面应用&#xff08;SPA&#xff09;&#xff0c;但随着版本的更新和发展&am…

【大数据篇】Spark:大数据处理的璀璨之星

【大数据篇】Spark&#xff1a;大数据处理的璀璨之星 文章目录 【大数据篇】Spark&#xff1a;大数据处理的璀璨之星一、什么是Spark?二、Scala的入门学习使用2.1 为什么要学习Scala?2.2 Scala基础语法 三、Spark 安装与环境配置四、Spark的核心组件五、Spark的优势六、spark…

刚接触抖店并开通了个体店,怎么快速起店呢?运营思路参考如下

我是王路飞。 如果你刚接触抖店&#xff0c;并且开通了个体店&#xff0c;但不知道如何做店的话。 其实很简单&#xff0c;抖店的流程并没有这么复杂。 电商的核心无非就是产品&#xff0c;抖店的运营也都是围绕产品展开的。 我给你们说下抖店的运营思路你们可以作为参考&a…

【Real】[Flask]SSTI

文章目录 前言一、题目解读二、解题过程三、知识点Flask是什么SSTI是什么SSTI是如何形成的易于利用的类payload是什么 探索类型和类层次结构和方法 前言 温馨提示&#xff1a;看到哪里不懂直接跳到知识点部分&#xff0c;理解完再回到解题过程。 一、题目解读 题目是[Flask]S…

如何使用Docker快速运行Firefox并实现远程访问本地火狐浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

如何给鸿蒙 APP 签名

生成签名证书指纹 在DevEco Studio工具侧生成密钥&#xff08;.p12&#xff09;和证书请求文件&#xff08;.csr&#xff09;。请根据以下使用场景&#xff0c;在AppGallery Connect侧申请应用证书&#xff08;.cer&#xff09;、Profile&#xff08;.p7b&#xff09;文件等。…

【Linux学习】进程间通信 (3) —— System V (1)

下面是有关进程通信中 System V 的相关介绍&#xff0c;希望对你有所帮助&#xff01; 小海编程心语录-CSDN博客 目录 1. System V IPC 1. 消息队列 msg 消息队列的使用方法 1.1 消息队列的创建 1.2 向消息队列发送消息 1.3 从消息队列接收消息 1.4 使用msgctl函数显式地…

计算机笔记12(续20个)

190.指令寄存器&#xff1a;存放当前的指令 程序计数器&#xff1a;下一条要执行的指令内存地址 191.IEEE802标准中&#xff1a;802.3规定了CSMA/CD访问控制方法和物理层技术规范 802.2规定了逻辑链路控制LLC 802.1B规定了寻址、网间互连和网络管理 802.1A规定了体系结构 19…

南京移动为“2024横山徒步大会”公共安全保驾护航

近年来&#xff0c;公共安全事件因伤害性大、波及人数多而引起公众的高度重视。江苏移动南京分公司充分履行企业社会责任&#xff0c;积极发挥移动5G、低空网络技术优势&#xff0c;为“2024横山徒步大会”提供网络保障、安全巡检及应急物资运输服务&#xff0c;建立起一道公共…

科技查新是什么?一文了解!

本文主要解答 1、什么是科技查新&#xff1f; 2、科技查新有哪些作用&#xff1f; 3、科技查新一般应用于什么地方&#xff1f; 4、在哪能出具正规查新报告&#xff1f; 5、科技查新流程是怎样的&#xff1f; 带着这些问题阅读这篇文章相信一定会有收获&#xff01;干活内…