原文地址: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. Swift3.0语言教程查找字符集和子字符串
  2. 皮尔·卡丹的管理思想精髓:从小做到大
  3. 将隐式神经表示(INR)用于2D图像
  4. 阿里云上JDK安全证书的实际位置
  5. figma下载_不用担心Figma中的间距
  6. 关于Xcode隐藏打印的logs的方法
  7. opencv glob 内存溢出异常
  8. java语言数组实现栈的操作_基于自定义的动态数组实现一个栈(Java语言)
  9. HCNE---succeed,HCSE---Learning!!!
  10. 统计字符 c语言程序,统计字符个数C语言程序.doc
  11. VC中画虚线矩形的方法
  12. (十九)论文阅读 | 目标检测之SNIP
  13. 如何通过回测报告中的指标评估策略优劣?
  14. java 实现Word或Excel 转Pdf
  15. css变形-扭曲(skew())
  16. 数字化时代,基于令牌的身份验证是如何工作?
  17. 多云管理平台解决方案
  18. apktools使用
  19. vue获取div高度
  20. css渐变写法 从左到右颜色渐变

热门文章

  1. 获取文件-属性-详细信息
  2. 电子技术书籍(日本)——有待补充完善
  3. 通过js进行post请求
  4. android是否支持 ipv6,判断你的网络是否支持IPv6
  5. 论文中的常用缩略语与关键词
  6. 苹果系列机型专业刷机,解锁,解ID
  7. MSN加外国好友的方法
  8. 1.Excel vba开发-处理空格数据
  9. 关于utc时间与格林威治时间(linux上获取系统时区及代码)
  10. Latex希腊字母、特殊符号汇总表