基类数组存放派生类_永远不要将派生类数组赋值给基类类型指针

c7ad478f5610c90c66aa8dd8723cc976.png

C.152: Never assign a pointer to an array of derived class objects to a pointer to its base

C.152:永远不要将派生类数组的指针赋值给基类指针

Reason(原因)

Subscripting the resulting base pointer will lead to invalid object access and probably to memory corruption.

作为赋值结果的基类指针的下标运算会引起无效的对象访问并可能发生内存破坏。

Example(示例)

struct B { int x; };struct D : B { int y; };void use(B*);D a[] = {{1, 2}, {3, 4}, {5, 6}};B* p = a;     // bad: a decays to &a[0] which is converted to a B*p[1].x = 7;   // overwrite D[0].yuse(a);       // bad: a decays to &a[0] which is converted to a B*

Enforcement(实施建议)

  • Flag all combinations of array decay and base to derived conversions.
  • 提示所有数组退化和基类类型向派生类类型转换的情况。
  • Pass an array as a span rather than as a pointer, and don't let the array name suffer a derived-to-base conversion before getting into the span
  • 使用span传递数组而不是指针,也不要再放入span之前让数组名经过一次派生类向基类类型的转换。

原文链接:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c151-use-make_shared-to-construct-objects-owned-by-shared_ptrs


觉得本文有帮助?请分享给更多人。

更多精彩文章欢迎关注微信公众号【面向对象思考】!

面向对象开发,面向对象思考!

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

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

相关文章

路由器和网关的区别?

1.网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.2…

C++error:找不到指定文件

做作业遇到这样的问题:新建了一个C工程,在内部新建了a.cpp a.h文件,将另一个工程里面的内容复制了过来,但是运行显示“找不到指定文件”,找了一下,发现虽然我的项目源文件里包换这个cpp文件,但是…

MVC 1.0的可能方法

如《 Java EE 8积极路线图》中所述,Java EE 8计划中未包含MVC 1.0。 我的看法以及在JavaOne期间与我交谈过的几个人的指示,这样做的可能结果是: MVC已完全删除 MVC继续并包含在Java EE 8(JSR 366)中 MVC继续作为Ja…

ES2015 中的函数式Mixin

原文链接:http://raganwald.com/2015/06/17/functional-mixins.html 在“原型即对象”中,我们看到可以对原型使用 Object.assign 来模拟 mixin,原型是 JavaScript 中类概念的基石。现在我们将回顾这个概念,并进一步探究如何将功能…

spring中的设计模式_面试:设计模式在spring中的应用

设计模式为我们解决一类问题提供了最佳的解决方案,我们在实际工作其实不太常用到,以至于会经常想不到设计模式。究其原因都是我们只是在使用别人框架的缘故,在这些框架的代码中经常能看到设计模式的影子,我们以spring为例&#xf…

linux route命令的使用详解

route命令用于显示和操作IP路由表。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是 为了解决以下问题:该Linux系统在一个局域网中,局…

C如何将二维数组作为返回值

做大作业遇到这样一个问题:在子函数里申请了一个二维数组,在主函数里要用到二维数组里的数据,但是在主函数里又不能提前申请(因为不知道数组长度),所以需要将数组return得到。 子函数: float **…

Spring的IOC底层实现

IOC的底层实现 续图: 转载于:https://www.cnblogs.com/phyger/p/10027712.html

python传文件给java_python使用简单http协议来传送文件

python使用简单http协议来传送文件!在ubuntu环境下,局域网内可以使用nc来传送文件,也可以使用基于Http协议的方式来下载文件我们可以使用python -m SimpleHTTPServer ${port}来启动服务默认的端口是8000,另外我们也可以指定端口&a…

C定义全局变量

程序工程中往往遇到这样的问题:某个变量是贯穿始终的,主函数以及不同的子函数都要用到这个变量,并且要调用子函数改变变量的值。这时候全局变量就起到一个桥梁作用,在函数外定义,在主函数中调用定义,在子函…

tensorflow(centos 7.0 64)安装

tensorflow安装 系统centos 7.0 64位: python版本:(注意tensorflow目前只支持python2.7版本) 安装pip yum update -y && yum install -y python python-devel epel-release.noarch python-pip 使用pip安装tensorflow pip install https://storag…

午餐前如何安装OpenStack Cloud

图1. QuickStart的内部工作原理 云安装程序 如果我告诉您可以在必须停下来吃午餐之前进行OpenStack Cloud环境设置,该怎么办? 您会感到惊讶吗? 你今天可以做吗? 在大多数情况下,我敢打赌您的答案是不可能的&#…

实现多线程的方式之实现Callable接口

package com.hls.juc;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * 创建多线程的方式 : 4种 * 1.继承Thread类 * 2.实现Runable接口 * 3.实现Callable接口 * 4.使用线程池创建线程 * *…

b 树查找时间复杂度_你心里是没点B树吗?

点击上方“零一视界”,选择“星标”公众号资源干货,第一时间送达1 引言数据库的增删改查等操作是开发过程中最为常见也是尤为重要的,尤其是现在大数据的兴起,导致数据存储量急剧增加,提升数据的操作效率就变得尤为关键…

Opencv imshow显示不出来图片

VSOPENCV处理图像时,imshow显示图片一片灰色,刚开始以为图片太大一直加载不出来,但是一直等不到显示出来,最后发现是因为最后忘记写 cvWaitKey(0);//或者waitKey(0);

vue 2个方法先后执行_有效快速制作工资条的2个方法

发工资是每个月员工们最期待的事情,但是对于HR来说却是非常头痛的工作。如何快速制作工资条?相信很多HR朋友们都很想知道,那么今天本文就和大家分享2个制作工资条的高效方法。 第一种:传统方式(Excel制作)制…

Opencv图像保存到电脑及显示

针对两种类型的图片有两种不同的方法: 1、对于Mat类型图像,用imwrite、imshow Mat img_goodmatch; imwrite("最终匹配结果.bmp", img_goodmatch); //“”里面为路径及图片名,可以改为绝对路径 …

机器学习算法库scikit-learn的安装

scikit-learn 是一个python实现的免费开源的机器学习算法包,从字面意思可知,science 代表科学,kit代表工具箱,直接翻译过来就是用于机器学习的科学计算包。 安装scikit-learn有两种方式: (1)安装…

从头基于空镜像scratch创建一个新的Docker镜像

我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像。优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包。 比如我机器上docker images返回的这些基于nginx的镜像,每个…

python bool转string_Python:可以返回boolean和string吗?

原始问题我已经创建了一个等待特定字符串出现在串行端口上的函数,并返回所有字符读取,直到找到该字符串,否则返回false.这很方便,但我想知道它是否被认为是不好的做法?澄清:主要目标是等待特定字符串在给定的时间内出现.除IO错误外,可能的结果为True(字符…