Rug*_*rra 5 c++ polymorphism segmentation-fault new-operator virtual-destructor
我在网站上找到了这段代码
#include <iostream>
using namespace std;
struct Base
{
Base() { cout << "Base" << " "; }
virtual ~Base() { cout << "~Base" << endl; }
int i;
};
struct Der : public Base
{
Der() { cout << "Der" << endl; }
virtual ~Der() { cout << "~Der" << " "; }
int it[10]; // sizeof(Base) != sizeof(Der)
};
int main()
{
Base *bp = new Der;
Base *bq = new Der[5];
delete bp;
delete [] bq; // this causes runtime error
}
Run Code Online (Sandbox Code Playgroud)
为什么会崩溃?
Base *bq = new Der[5];
delete [] bq; // this causes runtime error
Run Code Online (Sandbox Code Playgroud)
原因是数组不是多态处理的.因此,在上面的代码中,该delete语句调用未定义的行为.
§5.3.5/ 3 C++ 03说
在第一个替代(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.在第二个备选(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义.
您很幸运它会给出运行时错误,并且您有机会尽快知道代码中的严重错误.