C++中dynamic_pointer_cast和reinterpret_cast

dynamic_pointer_cast和reinterpret_cast

在C++中,类型转换是一个常见的操作。其中,dynamic_pointer_cast和reinterpret_cast是两种常见的类型转换方式。本文将介绍这两种类型转换的区别,并举例说明它们使用上可能造成的bug。

dynamic_pointer_cast

dynamic_pointer_cast是C++11中引入的一种类型转换方式,用于将一个指向基类的shared_ptr转换为指向派生类的shared_ptr。它的语法如下:

std::shared_ptr<Derived> derivedPtr = std::dynamic_pointer_cast<Derived>(basePtr);

其中,basePtr是一个指向基类的shared_ptr,Derived是一个派生类。

dynamic_pointer_cast会在运行时检查转换是否合法。如果转换不合法,它会返回一个空的shared_ptr。这种类型转换方式可以避免由于类型转换错误而导致的程序崩溃。

reinterpret_cast

reinterpret_cast是C++中的一种类型转换方式,用于将一个指针转换为另一个类型的指针。它的语法如下:

T* ptr = reinterpret_cast<T*>(p);

其中,p是一个指针,T是一个类型。

reinterpret_cast不会进行任何运行时检查,它只是简单地将指针的类型进行转换。这种类型转换方式非常危险,因为它可能会导致未定义的行为。

可能造成的bug

dynamic_pointer_cast和reinterpret_cast的区别在于它们是否进行运行时检查。如果类型转换错误,dynamic_pointer_cast会返回一个空的shared_ptr,而reinterpret_cast则不会进行任何检查,可能会导致未定义的行为。

下面是一个示例代码,演示了dynamic_pointer_cast和reinterpret_cast的区别:

#include <iostream>
#include <memory>class Base {
public:virtual void foo() {std::cout << "Base::foo()" << std::endl;}
};class Derived : public Base {
public:void bar() {std::cout << "Derived::bar()" << std::endl;}
};int main() {std::shared_ptr<Base> basePtr = std::make_shared<Derived>();// 使用dynamic_pointer_cast进行类型转换std::shared_ptr<Derived> derivedPtr1 = std::dynamic_pointer_cast<Derived>(basePtr);if (derivedPtr1) {derivedPtr1->bar();} else {std::cout << "dynamic_pointer_cast failed" << std::endl;}// 使用reinterpret_cast进行类型转换Derived* derivedPtr2 = reinterpret_cast<Derived*>(basePtr.get());derivedPtr2->bar();return 0;
}

在上面的代码中,我们首先创建了一个指向Derived对象的shared_ptr,并将它转换为指向Base对象的shared_ptr。然后,我们使用dynamic_pointer_cast和reinterpret_cast分别将basePtr转换为指向Derived对象的shared_ptr和指向Derived对象的裸指针。

在使用dynamic_pointer_cast进行类型转换时,如果转换失败,它会返回一个空的shared_ptr。因此,我们需要在使用derivedPtr1之前检查它是否为空。

而在使用reinterpret_cast进行类型转换时,它不会进行任何检查。因此,如果转换失败,它可能会导致未定义的行为。在上面的代码中,我们假设basePtr指向的是一个Derived对象,因此我们可以使用derivedPtr2调用bar()方法。但是,如果basePtr指向的是一个Base对象,那么使用derivedPtr2调用bar()方法就会导致未定义的行为。

因此,我们应该尽可能地避免使用reinterpret_cast进行类型转换,而应该使用更安全的类型转换方式,如dynamic_pointer_cast。

本文由 ChatGPT 生成

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

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

相关文章

MoveFunsDAO 星航计划|从Move入门Web3与深入实践「公益课堂」

Move 语言作为最安全的编程语言之一&#xff0c;在资产的安全性和保护方面有着显著优势&#xff0c;被寄予引领 Web3 世界的全新叙事的厚望。 随着 Sui 在今年五月主网上线&#xff0c;它为 Move 生态带来一股新的浪潮。上线以来&#xff0c;Sui 公链的开发活跃度持续数月位居…

【Qt之绘制兔纸】

效果 代码 class drawRabbit: public QWidget { public:drawRabbit(QWidget *parent nullptr) : QWidget(parent) {}private:void paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);// 绘制兔子的耳朵painter.s…

华为机试练习题:HJ51 输出单向链表中倒数第k个结点

1、Java代码&#xff08;直接运行版&#xff09; package listnodes;import java.util.Scanner;//Definition for singly-linked list. class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val val; }ListNode(int val, ListNode next) { this.va…

Read-Easy Excel源码解析(一)

Read&Write-Easy Excel 当我们需要导入大Excel时候&#xff0c;用POI会内存溢出&#xff0c;这时候我们用EasyExcel来解决&#xff0c;它底层采用的是SAX&#xff08;Simple Api for Xml&#xff09;事件驱动&#xff0c;解析xml的方式来解析excel文件。 首先我们看他的re…

十四、W5100S/W5500+RP2040树莓派Pico<NetBIOS>

文章目录 1 前言2 简介2 .1 什么是NetBIOS&#xff1f;2.2 NetBIOS的优点2.3 NetBIOS工作原理2.4 NetBIOS应用场景 3 WIZnet以太网芯片4 NetBIOS网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 随着…

响应式成人高考自考教育机构网站模板源码下载带后台

模板信息&#xff1a; 模板编号&#xff1a;30558 模板编码&#xff1a;UTF8 模板分类&#xff1a;学校、教育、培训、科研 适合行业&#xff1a;教育机构类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手工书写DIVC…

小程序 scroll-view 性能问题

先说使用场景&#xff0c;一次加载很多数据造成小程序卡顿的问题 &#xff0c;找了好多都没有好的解决办法&#xff0c;要么太过复杂&#xff0c;然后研究了两天通过简单的办法实现&#xff0c;先根据数量把高度撑开&#xff0c;然后根据滚动位置渲染指定的数据就可以了&#x…

多级缓存之JVM进程缓存

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时&#xff0…

【Linux】了解文件的inode元信息,以及日志分析

目录 一、inode表结构&#xff0c;以及元信息 1、了解inode信息有哪些 2、关于inode表的说明 Linux中访问文件的过程&#xff1a; 3、硬连接与软连接的区别&#xff0c;&#xff08;请看前面&#xff0c;写过的&#xff09; 二、文件系统的备份与恢复 三、几种常见的日志…

idea 模板参数注释 {@link}

1. 新增组 2. 设置方法注释及变量 增加模板文本 ** * $param$ * return {link $return$} */3. 设置变量表达式 勾选跳过param 参数表达式 groovyScript("def result ;def params \"${_1}\".replaceAll([\\\\[|\\\\]|\\\\s], ).split(,).toList();def param…

小白学爬虫:手机app分享商品短连接获取淘宝商品链接接口|淘宝淘口令接口|淘宝真实商品链接接口|淘宝商品详情接口

通过手机APP分享的商品短链接&#xff0c;我们可以调用相应的接口来获取淘口令真实URL&#xff0c;进而获取到PC端的商品链接及商品ID。具体步骤如下&#xff1a; 1、通过手机APP分享至PC端的短链接&#xff0c;调用“item_password”接口。 2、该接口将返回淘口令真实URL。 3…

kafka集群部署

1、首先部署zookeeper apiVersion: v1 kind: Service metadata:labels:app: zookeeper-clusternamespace: kafka-risktechname: zookeeper-cluster spec:selector:app: zookeeper-clusterports:- name: clientport: 2181targetPort: 2181- name: followerport: 2888targetPort…

[Linux] GRUB引导 学习笔记(一)

目录 概念 2.1 BIOS 2.2 UEFI 2.3 MBR与GPT 2.3.1 MBR 2.3.2 GPT 2.3.3 总结 2.4 GRUB GRUB2和GRUB Legacy区别 进入GRUB命令行 命令 GRUB工具命令 GRUB2配置 1.主要配置文件 2. 通过/etc/default/grub文件生成grub.cfg 定制GRUB的步骤 概念 BIOS、UEFI、MBR、G…

Programming abstractions in C阅读笔记:p184-p195

《Programming Abstractions In C》学习第61天&#xff0c;p184-p195总结。 一、技术总结 1.mutual recursion 2.natural number (1)定义 p184, If you limit the domain of possible values to the set of natural numbers,which are defined simply as the set of nonne…

visual studio 启用DPI识别功能

在开发widow程序时&#xff0c;有时必须将电脑 设置-->显示-->缩放与布局-->更改文本、应用项目的大小-->100%后&#xff0c;程序的画面才能正确运行&#xff0c;居说这是锁定了dpi的原因&#xff0c;需要启dpi识别功能。设置方法如下&#xff1a; 或者

C/S架构学习之组播

组播&#xff1a;过多的广播会占用网络带宽&#xff0c;产生广播风暴的现象&#xff0c;从而影响正常的通信活动&#xff1b;组播&#xff08;或者多播&#xff09;是局域网内部的通信&#xff0c;只有加入到某个多播组的主机才能收到数据&#xff1b;组播的方式既可以发给多个…

2023中国视频云市场报告:腾讯云音视频解决方案份额连续六次蝉联榜首,加速全球化布局

近日&#xff0c;国际数据公司&#xff08;IDC&#xff09;发布了《中国视频云市场跟踪&#xff08;2023上半年&#xff09;》报告&#xff0c;腾讯云音视频的解决方案份额连续六次蝉联榜首&#xff0c;并在视频生产创作与媒资管理市场份额中排名第一。同时&#xff0c;在实时音…

虹科示波器 | 汽车免拆检测 | 2017款长安福特翼虎车发动机故障灯异常点亮

一、故障现象 一辆2017款长安福特翼虎车&#xff0c;搭载CAF488WQ9发动机&#xff0c;累计行驶里程约为8.9万km。该车因发动机故障灯异常点亮在其他维修厂检修&#xff0c;维修人员用故障检测仪检测&#xff0c;提示气缸3失火&#xff0c;调换火花塞、点火线圈及喷油器&#xf…

动态、静态IP地址设置方法

目录 一、三种网络模式应用场景以及区别 1、 NAT&#xff08;Network Address Translation&#xff09;模式&#xff1a; 2、仅主机&#xff08;Host-Only&#xff09;模式&#xff1a; 3、桥接&#xff08;Bridged&#xff09;模式&#xff1a; 二、配置步骤 &#xff1a…

poi多sheet,模板导出数据

/*** 导出Excel* param response 响应对象* param headName 表头* param List 数据*/public static void exportExcel(HttpServletResponse response, String headName, List<数据对象> list) throws IOException {//读取模板Resource resourcenew ClassPathResourc…