智能指针的延迟报错问题

最近工作上发现一个比较复杂的代码出现随机报错问题,话不多说,直接debug模式开启ASAN机制构建程序,

set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -O0 -g -fstack-protector -fsanitize=address -fno-omit-frame-pointer")

很快能定位到报错的行,调用某个对象的成员函数的内部报错,说某个成员锁对象有问题,非法读取内存之类的。然后围绕这个锁,看了相关代码,没发现问题。干脆屏蔽这个锁的访问,发现访问某些成员变量也开始报错了,很奇怪,第一感觉是如果对象本身为空,外部调用的时候就应该报错了阿。

实在是想不通,看了一圈代码,也没发现明显问题,难道是ASAN此时报错较晚?干脆做个实验吧。代码如下:

#include <memory>class Person {
public:Person(const std::string& name) : name(name) {std::cout << "Construct Person: " << name << std::endl; }~Person() {std::cout << "Destroy Person: " << name << std::endl;}void print() {printf("xx\n");std::cout << "Name: " << name << std::endl; }  
private:std::string name;
};int ptrTest() {// 使用make_shared创建shared_ptr实例auto p1 = std::make_shared<Person>("John");// 直接创建shared_ptrstd::shared_ptr<Person> p2 = std::make_shared<Person>("Mary");// 使用get()获取原始指针Person* rawPtr = p1.get();// 使用重载的->调用成员函数p1->print();// shared_ptr支持 copystd::shared_ptr<Person> p3;// = p1;if(p3) {p3->print();}// 当所有shared_ptr都离开作用域或被重置时,对象才会被销毁return 0;
}int main() {ptrTest();
return 0;
}

果不其然,p3不赋值的情况下,debug模式下也能进入print内部进行调用,并不报错,如果print内部访问成员变量,那么此时报错,说读取非法内存,asan此时才报错,如果print内部完全不访问任何成员变量,那么整个过程可以顺利进行!即使是Debug模式。

那么最简单的解决方案就是调用智能指针的成员之前,就先检查指针本身是否合法了。直接if判断就行。最根本的解决方法是找到为什么没被赋值,这是必须要解决的问题了。

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

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

相关文章

huggingface——设置不同层不同学习率

前言 这玩意教程咋这么难找&#xff1f;&#xff1f;&#xff1f;&#xff1f; 代码 参考&#xff1a;https://github.com/X-PLUG/mPLUG-Owl/blob/main/mPLUG-Owl2/mplug_owl2/train/mplug_owl2_trainer.py#L133C33-L133C33 先定义你的trainer&#xff0c;继承huggingface的…

[EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 英特尔 NUC8i7HVK 处理器 Intel Core™ i7-8809G (Kaby Lake-r) 已驱动内存2x16GB DDR4-2400已驱动硬盘1TB PCIe-NVMe M.2 SSD已驱动显卡Intel HD 630 (Empty Framebuffer)Radeon™ RX Vega M GH Graphics 4GB已驱动声卡Realtek HDA ALC700已驱动网卡 英特…

前端根据URL地址实现下载(txt,图片,word,xlsx,ppt)

前端根据URL地址实现下载&#xff08;txt&#xff0c;图片&#xff0c;word&#xff0c;xlsx&#xff0c;ppt&#xff09; 一、对于txt,图片类的二、对于word&#xff0c;xlsx&#xff0c;ppt类的1.a标签可以实现下载2. window.open&#xff08;&#xff09; 一、对于txt,图片类…

aliexpress商品API(item_get-获得aliexpress商品详情):进行批量操作

使用AliExpress的店铺或分类API&#xff1a;这些API可以为你提供某个店铺或分类下的所有商品列表&#xff0c;然后你可以根据这个列表逐个查询商品详情。分批查询&#xff1a;你可以将商品ID分成多个批次&#xff0c;每次只查询一部分商品详情&#xff0c;这样既可以减少每次请…

用雪花算法生成全局唯一序列

雪花算法是一种分布式唯一ID生成算法&#xff0c;通过对时间戳、工作节点ID和序列号进行位运算和组合&#xff0c;生成一个可排序且唯一的64位ID。 实现原理&#xff1a; 首先&#xff0c;我们需要定义算法中的参数&#xff1a; 时间戳&#xff1a;使用当前时间戳&#xff0c;…

记录一个常量定义导致的重复问题duplicate symbol ‘_kk‘ in:

原因&#xff1a; 在.h文件中定义了一个常量 如下 NSString *const kk "FASDF";interface CardCourseViewController : LBBaseViewControllerend将这句代码去掉即可 NSString *const kk "FASDF";![请添加图片描述](https://img-blog.csdnimg.cn/direct…

工业RFID技术发展趋势分析

RFID技术是物联网的重要组成部分&#xff0c;是连接物理世界和数字世界的关键节点。RFID技术已经广泛应用于供应链管理、智能物流、零售、医疗、安防等领域&#xff0c;在工业制造领域也有着广泛的应用前景和市场潜力。 工业RFID技术发展趋势分析 工业RFID技术是一种利用无线射…

买工业用品就找震坤行,提供震坤行商品数据,数据分析的API接口

要接入API接口以采集电商平台上的商品数据&#xff0c;可以按照以下步骤进行&#xff1a; 1、找到可用的API接口&#xff1a;首先&#xff0c;需要找到支持查询商品信息的API接口。这些信息通常可以在电商平台的官方文档或开发者门户网站上找到。 2、注册并获取API密钥&#x…

什么是差值表达式

在Vue.js中&#xff0c;差值表达式是一种基本的数据绑定形式&#xff0c;用于将数据绑定到文档对象模型&#xff08;DOM&#xff09;上。差值表达式通常使用双大括号 {{ }} 来表示&#xff0c;这种语法非常直观。当Vue实例的数据发生变化时&#xff0c;差值表达式的内容也会相应…

CCNP课程实验-06-EIGRP-Trouble-Shooting

目录 实验条件网络拓朴 环境配置开始排错错误1&#xff1a;没有配置IP地址&#xff0c;IP地址宣告有误错误2&#xff1a;R3配置了与R1不同的K值报错了。错误3&#xff1a;R4上的AS号配置错&#xff0c;不是1234错误4&#xff1a;R2上配置的Key-chain的R4上配置的Key-chain不一致…

LCR 155. 将二叉搜索树转化为排序的双向链表

解题思路&#xff1a; 中序遍历法&#xff08;二叉搜索树在中序遍历时是从小到大排列的&#xff09;。 // 打印中序遍历 void dfs(Node root) {if(root null) return;dfs(root.left); // 左System.out.println(root.val); // 根dfs(root.right); // 右 }采用head作为返回&am…

C++:自创小游戏

欢迎来玩&#xff0c;每次都有不一样的结果。 长达142行。 #include<bits/stdc.h> #include<windows.h> #define random(a,b) (rand()%(b-a1)a) using namespace std; int main(){int n;cout<<"输1~10,越小越好,不告诉你有什么用&#xff0c;当然也可…

跑步中位数

title: 跑步中位数 date: 2024-01-04 15:47:51 tags: 对顶堆 catefories: 算法进阶指南 题目大意 解题思路 动态维护中位数问题。可以建立两个二叉堆&#xff0c;一个大顶堆一个小顶堆&#xff0c;在依次读入整数序列的过程中&#xff0c;设当前序列长度为 M M M,我们始终保持…

docker-简单说说cgroup

前面我们简单说了下namespace&#xff0c; 现在我们来接着简单说说cgroup。通过docker-简单说说namespace文章我们知道&#xff1a; namespace 是为了隔离进程组之间的资源&#xff0c;那cgroup就是为了对进程组的监控和限制资源。Cgroup 可以限制进程组使用的资源数量和分配&a…

中国5米分辨率坡度数据

中国5米分辨率坡度数据 坡度是地表单元陡缓的程度&#xff0c;通常把坡面的垂直高度和水平距离的比值称为坡度。坡度的表示方法有百分比法、度数法、密位法和分数法四种&#xff0c;其中以百分比法和度数法较为常用。 中国5米分辨率坡度数据集&#xff0c;利用5米分辨率DEM数据…

借还款记账表,借款还款记账软件

我们每个人都在为生活奔波&#xff0c;为事业打拼。但有时候&#xff0c;生活中的一些小事情&#xff0c;比如朋友间的借贷、还款&#xff0c;就可能让我们的生活变得有些混乱。为了解决这个问题&#xff0c;一个全新的借还款记账软件【晨曦记账本】横空出世&#xff0c;它不仅…

如何实现APP安全加固?加固技术、方法和方案

​ 本文我们着重分享App安全加固的相关内容。 ​ &#xff08;安全检测内容&#xff09; 通过前面的文章我们知道了app安全检测要去检测哪些内容&#xff0c;发现问题后我们如何去修复&#xff1f;如何避免安全问题&#xff1f;首先我们先来讲一下APP安全加固技术。 Ipa Guar…

在Impala中分页 进行SQL查询并分页可以使用LIMIT子句来限制返回结果集的数量。

在Impala中进行SQL查询并分页可以使用LIMIT子句来限制返回结果集的数量。 示例1&#xff1a;获取前5条记录 SELECT * FROM table_name LIMIT 5;示例2&#xff1a;从第6条开始获取后面的5条记录&#xff08;每次获取5条&#xff09; SELECT * FROM (SELECT t.*, ROW_NUMBER()…

pinia 给 state 指定变量类型

pinia 给 state 指定变量类型 问题描述 自从用 vitetsvue3 以来&#xff0c;我一直有一个很大的疑问&#xff0c;就是 pinia 中的 state 变量类型该从哪定义&#xff0c;如何定义它&#xff1f; 因为我在使用未定义类型的 state 变量的时候一直会有一个提示&#xff0c;提示说…

nodejs和vuejs的区别

一、vue项目开发中&#xff0c;两个经常混合使用。 不同&#xff1a; 1、概念不同&#xff1a; 一个是前端框架&#xff0c;一个是服务端语言。 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使…