300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > C++通过基类指针delete派生类数组 析构函数是虚函数 程序为什么会崩溃? https://w

C++通过基类指针delete派生类数组 析构函数是虚函数 程序为什么会崩溃? https://w

时间:2021-03-15 07:34:19

相关推荐

C++通过基类指针delete派生类数组 析构函数是虚函数 程序为什么会崩溃? https://w

/question/30838092/answer/49623765

C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃?

代码如下

#include<iostream>using namespace std;class base{public:virtual ~base(){}};class derived:public base{int a;};int main(){base *p=new derived[10];delete[] p;return 0;}

举报 7 条评论 分享

查看全部 10 个回答

bryantism,给我一个理由忘记 weyou、刘源、任思远等人赞同

c++ 03 5.3.5

In the first alternative (delete object), if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined.In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.

编辑于 -05-317 条评论感谢 分享 收藏•没有帮助• 举报 •作者保留权利更多回答vczh,专业造轮子, 李嘉图、赖威、李国宝等人赞同

在某些实现里,base4个字节,derived8个字节,你new了一个80个字节的derived*数组然后当base*干掉,那么要么它就会执行析构函数20次然而有10个this指针式不对的,要么他会执行10次然而有5个this指针是不对的。自然要挂。

然而在VC++下面却没问题,因为VC++的实现是记录了array的个数和每个对象的大小,他不会因为你把数组搞成了base*就真的以为他是base[],所以会执行10次析构函数,10次的this指针都对。

为什么错误的this指针就会挂呢?因为从base调用derived::~derived函数的方法,是先把一个固定的数字加到this指针上面得到一个全局的代表derived在base上面的虚函数表,然后再虚函数表里面找到析构函数的指针,最后执行它。如果你的this有问题,那中间有一步就会dereference失败,自然AV。

Edward 不明觉屌啊…… -06-012赞 何磊 执行10次但是有5个this指针是不对的,为什么啊? -06-01 Warthog 这么正经的回答居然没几个人评论。。。 -06-011赞 尤不二回复何磊 执行10次的情况是:删除了10个4byte,每两个4byte指向的是正确的derived,自然有一半的this是错的 -06-01 fx991ESplus回复何磊 sizeof(base)是4,sizeof(derived)是8呗 -06-01 莫惜培 某些实现,话里有话啊 -06-01 何磊回复尤不二 懂了,谢谢 -06-01 孙明琦 还是vc的扩展厉害 -06-01 许镇 轮子哥一正经起来我就看不懂了 -06-011赞 洛漓 0.0轮子哥貌似很推崇VC++ -06-01 fx991ESplus回复莫惜培 g++…… -06-01 汪堇年 不信linux环境下会有问题 -06-01 vczh(作者)回复汪堇年 呵呵 -06-01 从此寂静无声 学习了 -06-01 周翀 仅就这个特例来说,后十次,编译器应该是call十次base::~base并压入“错误”的this(实际也没太错),然后dtor里面也没碰this,为啥还会crash? -06-02 vczh(作者)回复周翀 因为dtor是虚函数 -06-02 周翀回复vczh(作者) ……哦,靠!(逃…… -06-02 李爱吉 只是, msvc的实现的是对标准的扩充, 方言特性不具备移植性 -06-02 Warthog回复柯基屁 这是C++的基础知识啊 -06-021赞 汪堇年回复vczh(作者) 挂一下代码吧 -06-02 Warthog回复柯基屁 果然他的脑残粉不会写代码的比会写代码的多一个数量级。。 -06-02 Warthog回复柯基屁 因为就是脑残粉啊 -06-02 飞大郎 虽然一句也看不懂,依然要点赞。 -06-02 Warthog回复柯基屁 I don't give a fuck -06-02 王星 一个都看不懂 -06-03 汪良 “然而在VC++下面却没问题” -06-03 汪良 刚试了下,g++ 5.1.0 不行,clang++ 3.5.0 没出现问题。 -06-03回复赞

C++通过基类指针delete派生类数组 析构函数是虚函数 程序为什么会崩溃? /question/30838092/answer/49623765

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。