C++的指针的坑:“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起...
原文地址:http://www.cppblog.com/vczh/archive/2013/04/27/199765.html
posted on 2013-04-27 17:24 陈梓瀚(vczh)
C++的指针的坑。剩下的坑留到下一篇文章里面。下面要讲的这个坑,如果不是在粉丝群里面被问了,我还不知道有人会这么做:
class Base {... };class Derived : public Base {... };Base* bs = new Derived[10]; delete[] bs;
我想说,这完全是C++兼容C语言,然后让C语言给坑了。其实这个问题在C语言里面是不会出现的,因为C语言的指针其实说白了只有一种:char*。很多C语言的函数都接受char*,void*还是后来才有的。C语言操作指针用的malloc和free,其实也是把他当char*在看。所以当你malloc了一个东西,然后cast成你需要的类型,最后free掉,这一步cast存在不存在对于free能否正确执行来说是没有区别的。
但是事情到了C++就不一样了。C++有继承,有了继承就有指针的隐式类型转换。于是看上面的代码,我们new[]了一个指针是Derived*类型的,然后隐式转换到了Base*。最后我们拿他delete[],因为delete[]需要调用析构函数,但是Base*类型的指针式不能正确计算出Derived数组的10个析构函数需要的this指针的位置的,所以在这个时候,代码就完蛋了(如果没完蛋,那只是巧合)。
为了兼容C语言,“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起。实际上,如果需要解决这种问题,那类型应该怎么改呢?其实我们可以跟C#一样引入Derived[]的这种指针类型。这还是new[]出来的东西,C++里面也可以要求delete[],但是区别是他再也不能转成Base[]了。只可惜,T[]这种类型被C语言占用了,在函数参数类型里面当T*用。C语言浪费语法罪该万死呀……
转载于:https://www.cnblogs.com/ConfuciusPei/archive/2013/04/30/5118417.html
C++的指针的坑:“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起...相关推荐
- 父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数...
父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数 以下程序的显示结果是什么,为什么 #include <iostream> using namespace st ...
- 父类指针指向子类对象的问题、父类对象和子类对象之间的问题
一.父类指针指向子类对象 先上代码: class Base {public:void base_fun1() {}virtual void base_fun2() {cout << &qu ...
- C++智指针之——boost::intrusive_ptr,一种与shared_ptr、unique_ptr截然不同的智能指针
智能指针boost::shared_ptr/std::shared_ptr使用了和数据无关的引用计数,在使用shared_ptr之前,必须要搞清楚资源的所有权和资源的使用权这两个问题(详见<C+ ...
- 父类指针访问子类成员变量
1.父类指针获取子类成员变量 1 #include <iostream> 2 3 using namespace std; 4 5 class Base { 6 public: 7 vir ...
- 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)...
在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL) 转载于:https://www.cnblogs.com/linjj/p/5115735.html
- 判断两条链表是否交叉,若有交叉,返回交叉节点的指针。
上周面试挂了,反思原因,莫非是因为一道算法题没做好吗?这题目是"判断两条链表是否交叉,若有交叉,返回交叉节点的指针." 为了防止反复在同一个阴沟里翻船,决定把最优解写出来. #in ...
- 通过对象指针的方式强行指定到子类_C++中的虚指针与虚函数表
最近在逛B站的时候发现有候捷老师的课程,如获至宝.因此,跟随他的讲解又复习了一遍关于C++的内容,收获也非常的大,对于某些模糊的概念及遗忘的内容又有了更深的认识. 以下内容是关于虚函数表.虚函数指 ...
- 父类指针指向子类对象,子类指针不能指向父类对象
class Parent { public:int a };class Child :public Parent { public:int b; }Parent类占内存大小范围:int a; 占4个字 ...
- 父类指针可以指向子类对象
结论:父类指针可以指向子类对象,但是只能访问父类成员,不能访问子类成员 结论:子类指针不可以指向父类对象,需要类型转换才可以 笔记: <1>.当基类指针指向派生类的时候,只能操作派生类从基 ...
最新文章
- Swift3.0语言教程查找字符集和子字符串
- 皮尔·卡丹的管理思想精髓:从小做到大
- 将隐式神经表示(INR)用于2D图像
- 阿里云上JDK安全证书的实际位置
- figma下载_不用担心Figma中的间距
- 关于Xcode隐藏打印的logs的方法
- opencv glob 内存溢出异常
- java语言数组实现栈的操作_基于自定义的动态数组实现一个栈(Java语言)
- HCNE---succeed,HCSE---Learning!!!
- 统计字符 c语言程序,统计字符个数C语言程序.doc
- VC中画虚线矩形的方法
- (十九)论文阅读 | 目标检测之SNIP
- 如何通过回测报告中的指标评估策略优劣?
- java 实现Word或Excel 转Pdf
- css变形-扭曲(skew())
- 数字化时代,基于令牌的身份验证是如何工作?
- 多云管理平台解决方案
- apktools使用
- vue获取div高度
- css渐变写法 从左到右颜色渐变