原文地址: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[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起...相关推荐

  1. 父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数...

    父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数 以下程序的显示结果是什么,为什么 #include <iostream> using namespace st ...

  2. 父类指针指向子类对象的问题、父类对象和子类对象之间的问题

    一.父类指针指向子类对象 先上代码: class Base {public:void base_fun1() {}virtual void base_fun2() {cout << &qu ...

  3. C++智指针之——boost::intrusive_ptr,一种与shared_ptr、unique_ptr截然不同的智能指针

    智能指针boost::shared_ptr/std::shared_ptr使用了和数据无关的引用计数,在使用shared_ptr之前,必须要搞清楚资源的所有权和资源的使用权这两个问题(详见<C+ ...

  4. 父类指针访问子类成员变量

    1.父类指针获取子类成员变量 1 #include <iostream> 2 3 using namespace std; 4 5 class Base { 6 public: 7 vir ...

  5. 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)...

    在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL) 转载于:https://www.cnblogs.com/linjj/p/5115735.html

  6. 判断两条链表是否交叉,若有交叉,返回交叉节点的指针。

    上周面试挂了,反思原因,莫非是因为一道算法题没做好吗?这题目是"判断两条链表是否交叉,若有交叉,返回交叉节点的指针." 为了防止反复在同一个阴沟里翻船,决定把最优解写出来. #in ...

  7. 通过对象指针的方式强行指定到子类_C++中的虚指针与虚函数表

    ​ 最近在逛B站的时候发现有候捷老师的课程,如获至宝.因此,跟随他的讲解又复习了一遍关于C++的内容,收获也非常的大,对于某些模糊的概念及遗忘的内容又有了更深的认识. 以下内容是关于虚函数表.虚函数指 ...

  8. 父类指针指向子类对象,子类指针不能指向父类对象

    class Parent { public:int a };class Child :public Parent { public:int b; }Parent类占内存大小范围:int a; 占4个字 ...

  9. 父类指针可以指向子类对象

    结论:父类指针可以指向子类对象,但是只能访问父类成员,不能访问子类成员 结论:子类指针不可以指向父类对象,需要类型转换才可以 笔记: <1>.当基类指针指向派生类的时候,只能操作派生类从基 ...

最新文章

  1. 干货丨深度学习初学者必读:究竟什么是张量?
  2. AES和TKIP的区别
  3. A. A Prank
  4. Oracle簇表介绍 (clustered table)
  5. Spring学习(八)AOP详解
  6. java实验原理和图例_图例解析JDK,JRE,JVM概念及使用
  7. 计算机负责指令代码的是,计算机组成原理习题2新版资料.doc
  8. L - Two Ants Gym - 102823L
  9. struts2获取请求参数的三种方式及传递给JSP参数的方式
  10. 3D打印技术在医疗领域能做些什么?帮助精确完成手术
  11. Alt属性 添加的意义
  12. python requests下载图片_Python使用urllib库、requests库下载图片的方法比较
  13. jquery的图片轮播 模板类型
  14. ArcGIS Runtime SDK for Android 加载shp数据,中文乱码问题
  15. html下拉菜单右侧显示,css如何设置下拉菜单?
  16. 3.12_ValueError: x and y must have same first dimension, but have shapes (100,) and (1,)
  17. Fluent残差图中continuity不收敛如何处理
  18. 记一次个人网站logo设计
  19. 今年寒假提前!清华、华南理工等多所高校纷纷官宣
  20. Google翻译修复小工具

热门文章

  1. 前端实现生成带有样式的excel表格 Node和浏览器读写Excel文件探究实践
  2. [CVPR2020]Learning to Cartoonize Using White-box Cartoon Representations
  3. 【代码重构(Refectoring)系列教程】代码臃肿(Bloaters)--臃肿类(Large Class)
  4. 常用电脑硬件技术术语集锦
  5. 数学的奇妙世界(1)—— 引言和线性代数
  6. 第九章 9.3.4节练习 9.3.5节练习
  7. java中草药美白淡斑紧肤膏_中医:美白5种药材+美白淡斑3个偏方
  8. 拥有全球七亿用户数据的墨迹赤必,能用天气服务为企业带来什么新气象?
  9. MySQL查询语句大全(列举所有常用查询方式)
  10. NOIP信息学奥赛_普及组第一课--我是谁