void 指针问题

C++多重继承与void*指针转换问题 C++支持多重继承,然而多重继承可能会导致一些奇怪的问题,我前段时间遇到一个指针转换问题,非常典型。 先看一个简单的测试代码: #include <iostream> using namespace std; class IA { public: virtual ~IA(){} virtual void a() = 0; }; class IB { public: virtual ~IB(){} virtual void b() = 0; }; class 阅读详情

void *p = new ClassA();
delete p; //错误。不会调用ClassA的析构函数
delete (ClassA*)p; //正确。指明指针类型

 

ClassA *lpA = new ClassA();
void *q = lpA;
delete q; //错误。不会调用ClassA的析构函数
delete (ClassA*)q; //正确。指明指针类型

 

class ClassA
{
public:
 ClassA(){TRACE("ClassA constructor!/n");};
 ~ClassA(){TRACE("ClassA destructor!/n");};
};

class ClassB : public ClassA
{
public:
 ClassB(){TRACE("ClassB constructor!/n");};
 ~ClassB(){TRACE("ClassB destructor!/n");};
};

 

ClassA *p1 = new ClassB(); //先调用ClassA的构造函数。再调用ClassB的构造函数。(先执行基类构造,再执行继承类构造)
delete p1; //只调用ClassA的析构函数。因为p1是ClassA
ClassA *p2 = new ClassB();
delete (ClassB*)p2; //先调用ClassB的析构函数。再调用ClassA的析构函数。(先执行继承类析构,再执行基类析构)
ClassA *p3 = new ClassB();
delete (ClassA*)p3; //同delete p1;

//ClassB *p4 = new ClassA(); //不能由基类转化为继承类
//delete p4;
 

输出:

ClassA constructor!
ClassB constructor!
ClassA destructor!


ClassA constructor!
ClassB constructor!
ClassB destructor!
ClassA destructor!


ClassA constructor!
ClassB constructor!
ClassA destructor!

结论:
     1、继承类创建时先执行基类的构造函数,再执行继承类的构造函数。
     析构的时候顺序相反,先执行继承类的析构函数,再执行基类的析构函数。
     2、执行 delete a; 时,是根据 a 的类型来决定如何释放对象。与它指向的对象类型无关

 

 

class ClassA
{
public:
 ClassA(){TRACE("ClassA constructor!/n");};
 virtual ~ClassA(){TRACE("ClassA destructor!/n");};
};

class ClassB : public ClassA
{
public:
 ClassB(){TRACE("ClassB constructor!/n");};
 ~ClassB(){TRACE("ClassB destructor!/n");};
};

 

ClassA *p1 = new ClassB(); 
delete p1; //先调用ClassB的析构函数,再调用ClassA的析构函数。因为virtual ~ClassA()

Linux内核同步原语之队列自旋锁(Queued Spin Lock)深度解析 本文深度解析了Linux内核中的队列自旋锁(Queued Spin Lock)机制。通过对比传统自旋锁的瓶颈,详细阐述了队列自旋锁如何利用紧凑的4字节结构、每CPU节点数组和pending位优化,有效解决多核(SMP)系统中的缓存行乒乓和惊群效应,实现公平、高效的锁等待队列,从而显著提升内核在高并发场景下的可扩展性与性能。 阅读详情

相关推荐

【深圳】IBM V3500存储维修 更换控制器故障

今天给大家分享的是深圳.福田区一个电商客户公司一台IBM Storwize v3500存储控制器故障从远程诊断 收集日志 分析结果的实际案例,如图所示通过存储管理口登陆进去后直接看到少了一个控制器,经过工程师分析日志后判定为该控制器损坏,接下来更换控制器配件,标准套件的控制器不带子卡和电池,所以需要把故障控制器上的子卡和电池拆下来装到新控制器上,这个电池拆还需要点技巧,接着把新的控制器插回V3500主机,等待大约十分钟后,新控制器指示灯全绿,管理界面看到节点已联机;冠峰科技-爱科技爱分享。

OuYangYuXi的博客 4573

C语言指针高级部分:void指针和数据指针

概念 void指针 数据指针 void指针void指针的基本概念void的意思就是“无类型”,void指针则为“无类型指针”,void指针可以指向任何类型的数据。 所以void指针一般被称为通用指针或者泛指针,或者叫做万能指针 定义形式 : void *p;**在C语言中在任何时候都可以用void类型的指针来代替其他类型的指针,void指针可以指向任何数据类型的变量** **如果要通过vo

章飞 _906285288的博客 1万+

EtherCAT APWR报文实战:从站地址配置(0x0010)的初始化流程与报文解析

本文详细解析了EtherCAT APWR报文在从站地址配置(0x0010寄存器)中的初始化流程与实战应用。通过类比物业分配门牌号,生动解释了APWR报文如何高效批量配置从站地址,并深入探讨了0x0010寄存器的特殊作用、初始化步骤及常见问题排查方法。文章结合IgH主站的三从站配置案例,提供了报文解析技巧和调试建议,帮助工程师快速掌握EtherCAT网络配置的核心技术。

weixin_28744423的博客 410

void指针类型

void指针类型作用 void指针为无类型指针,可以指向任何类型数据。 作用 C语言中引入void指针类型在于两个方面 对函数返回的限定 对函数参数的限定 此外,一般只能用指向相同类型的指针给另一个指针赋值,而在不同类型的指针之间进行赋值是错误的 例: int a,b; int *p=&a,*p2=&b; //yes! int a,b; int *p=&a; char *p2=&b; //NO! (不兼容指针类型的初始化) void指针对于上述出现的错误而言是一个特

咸鱼菌 2355

《活用数据——驱动业务的数分析实战》读书笔记 (实战篇)

第四章、战略分析案例解析         如思维篇所述,分析思路是从研究目的到研究内容的分解过程。因此需要考虑如下两个问题: 战略分析的研究目的 战略分析的研究内容 1、研究目的:战略选择         战略分析的研究目的是帮助企业进行战略选择,选择适合自己的目标市场。需要回答以下两个问题: 市场吸引力:这个市...

Xiaozhu的博客 3698

手把手教你用Foobar2000播放DSD音频(含DOP设置与SPDIF输出教程)

本文详细指导如何在Foobar2000中播放DSD音频,重点解析了DOP协议的原理与设置方法。通过安装SACD插件、配置输出设备及启用DOP模式,实现DSD音频的原生比特流输出,并特别讲解了如何通过SPDIF接口传输DSD信号,帮助发烧友充分释放高清音频设备的潜力。

weixin_29290963的博客 1814

关于void类型指针-----void*、void**

指针有两个属性:指向变量/对象的地址和长度  但是指针只存储地址,长度则取决于指针的类型  编译器根据指针的类型从指针指向的地址向后寻址  指针类型不同则寻址范围也不同,比如:  int*从指定地址向后寻找4字节作为变量的存储单元  double*从指定地址向后寻找8字节作为变量的存储单元  1.void指针是一种特别的指针     void *vp     //说它特别是因为它没有类型     ...

淡淡的宁静的博客 1万+

修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

【代码】修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

路~可以走过 2772

c语言中无类型void*指针的几大特性

void类型指针在使用中与其他类型指针不同,在使用中应注意: 1.无类型指针不能对内存进行解释,只能获得对象地址 int main() { void *p; int n=sizeof(*p); printf(&amp;quot;%d\n&amp;quot;, n); return 0; } 当程序编译到sizeof(*p)时报错,p不是指向完整类型的指针,也就是说编译器此时不知道该将p指针解释为多少个字节。 2. 无类型指...

博客小站 1098

STM32入门教程:图像处理

然后,我们使用 STM32 的 DSP 模块中的 arm_mean_u8 函数计算原始图像的平均值,并将结果存储在 meanValue 变量中。然后,我们需要编写代码配置 STM32 的外部中断输入引脚,并在中断处理函数中读取 OV7670 摄像头模块输出的图像数据。然后,我们需要编写代码配置 STM32 的 USB OTG 接口,并在回调函数中读取 USB 摄像头输出的图像数据。一、图像采集 图像采集是图像处理的第一步,我们需要将外部图像源的数据导入到 STM32 中进行处理。

2401_85625565的博客 1616

Simulink仿真模块 -Scope

如果您将 Scope 模块放在具有锁定链接的库或者锁定的库中,当尝试打开示波器窗口时,Simulink 会显示错误。要显示某个库模块中的内部数据,请为库模块添加一个输出端口,然后将此端口连接到您模型中的 Scope 模块。当您在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。当在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。如果在仿真开始时波形视图关闭,则当在仿真后打开波形视图时,波形视图将显示附加的输入信号的仿真结果。

jk_101的博客 3788

浅谈void指针的类型转换问题

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 (说白了就是地址,32位机子中任何一个指针的长度都是4个字节,因为逻辑地址就占用4字节) 以下结果是基于VC++和VS2010的 1.C中对指针类型的转换要求很低。但是这将留下一个很大的漏洞 int* a=Null; void* b=Null;char* c=Null;c=a; //warning C4133:...

Stephen_yu的专栏 2292

【KingSCADA】如何建立硬件系统及相关变量

本篇主要讲解如何定义设备,如何定义变量。KingSCADA3.8的采集系统是指负责和现场设备进行通讯,并采集现场数据和控制现场数据的模块,称之为采集器,也叫IOServer应用,它是一组独立的应用程序,可以脱离KingSCADA3.8软件,它依赖于KingSCADA3.8驱动产品,通过驱动与IO设备进行通讯。采集系统由通讯链路,设备,数据块组成。链路:链路是指计算机通过什么方式(接口)与设备进行连接,链路类别:串口,以太网,GPRS,Modem,通信卡,采集卡,无链路。

做有价值的事,积累有价值的笔记! 1万+

关于void指针的地址问题

如图 void指针指向其他类型的数据时对其地址加1 它可指向几乎任何数据,且指针加1时相当于字符指针加1,利用这一特性可将void指针作为形参类型,可传入任意数据且对形参操作时可类比字符指针,使其具有格式化的特点。 ...

YukinoLover的博客 1038

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

c++ void指针问题

c++,void指针说明

lucust的博客 202

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

关于二级指针void**的一点问题与思考

这两天写一个高并发内存池的项目时,遇到了一个关于二级指针的问题,剖析清楚后发觉有必要记录一下,这让我加深了对于C/C++中指针的理解(果然学到老活到老)。

qq_53324833的博客 1467

void*指针的使用和问题说明

今天在移植和优化算法程序时遇到一个问题,这个问题可能老手工程师会经常见,我却在这里犯迷糊了, 话不多说先上代码看看问题是啥 typedef void *GDALDatasetH; GDALDatasetH baseImgDS = GDALOpenShared(baseImgPath,GA_ReadOnly); GDALDatasetH regImgDS...

jackchoise030的博客 378

delete void *指针的问题

在您的代码中,data 被声明为 void* 类型。来释放内存时,编译器无法确定 data 指向的数组的元素类型。来释放内存时,编译器能够确定 data 指向的数组的元素类型,并正确地释放内存。在 C++ 中,当您使用 new[] 运算符动态分配一个数组时,您必须使用数组形式的 delete[] 运算符来释放该数组所占用的内存。然而,为了正确地使用 delete[] 运算符,您必须提供一个指向数组元素类型的指针。在这一行中,您试图使用数组形式的 delete 运算符来释放 data 指向的内存。

sunfanup的博客 697

C语言之void 指针问题

 int download_addr; void abc(void) { download_addr = 0x0c400000; void (*fun)(void); fun = (void (*)(void))download_addr; (*fun)(); } 解释:download_addr 是一个函数指针 void (*fun)(void); 定义一个函数指针func 输入参数为v

techseeker 1154

void* unknown size问题及结构体转指针问题

话说这么长时间的编程,竟然没有写一篇文章,感觉不是个好的编程人员,一个好的编程人员,要懂得分享;但是,当要写文章时,又不知道怎么写了,看来是要多加练习了,与编程一样,要勤练习。不说废话了,进入正题。         在之前没有对void*类型的指针进行操作时,自己认为其是可以通过“+”或“-”来进行字节的偏移,但直到今天实际中运到才发现,原来对其进行如下操作时,         void* p

ByMain5123的博客 1867

gcc对void型指针的类型检查有问题?

不要使用void **参数

六个九十度 1156

Void*指针(空指针)讲解----关于强制转换后能不能自身++的问题

结言:本人笔拙,无法将自身的想法一一阐述,希望各位在阅读完后,能给出相应的意见,也欢迎大家在阅读之后提出一些问题,我很乐意帮助大家。前置++在有些编译器是会出现错误的,例如在c++中就不能这样去使用,不能保证完全正确的,不然会出现下列问题。强制类型转换是临时的!在后置++的时候这个强制类型转换没有发挥作业了。那我们该如何实现void*指针+-呢。前言-----是不可以的。这样就可以了~~~~

K1的博客 423

【C/C++】指针的思考与注意:空指针,指针赋值,void*指针,二级指针,结构体指针,指向同一地址的多个指针释放问题

部分参考自:https://blog.youkuaiyun.com/u012351051/article/details/96753703 1. 啥是指针 指针是地址,而不是具体的标量值,这是指针的精髓,不管是一级指针、二级 指针、 整型指针、浮点数指针、结构体指针等等等等所有类型的指针,内容都是个地址,而指针本身当然也是有地址的,而且容易忽略的是,不管这个指针指向的类型多么复杂,比如一个特别大的结构体,它的指针和一个 char型指针的大小本质上是一样的,因为指针就是起始地址。 正式由于这个原因,(void )型指针才

All_In_gzx_cc的博客 2131

你真的懂void*吗?3个问题检验你对指针转换的理解深度

掌握C语言void*指针转换难题?本文解析void*指针强制转换规则,涵盖内存操作、函数传参等应用场景,揭示类型安全与转换核心方法,提升代码健壮性,值得收藏。

LiteCompile的博客 723
上一篇: 如何解决VS中“找不到MSVCR80.dll”的问题
下一篇: 【转】zlib 与 libpng 的配置与使用 part1
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值