virtual destructor fail using array
Asked Answered
C

1

6

I found this code on a web site

#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
}

why does it crash?

Cornie answered 13/10, 2011 at 13:0 Comment(4)
possible duplicate of Polymorphism & Pointers to arraysQuincey
also https://mcmap.net/q/1772349/-why-does-this-code-crash-at-the-places-mentionedQuincey
Just use std::vector<Base*> instead of array ...Crosseye
Or std::array<Base*> from C++0x...Crosseye
D
11
Base *bq = new Der[5];
delete [] bq;   // this causes runtime error

The reason is arrays are not treated polymorphically. Therefore, in the above code, the delete statement invokes undefined behaviour.

§5.3.5/3 C++03 says

In the first alternative (delete object), if the static type of the operand 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.

You're lucky that it gives runtime-error, and you got the opportunity to know a serious bug in your code, as soon as possible.

Drabbet answered 13/10, 2011 at 13:12 Comment(1)
And this appears to be the case still in C++11. Same section: 5.3.5/3Empyema

© 2022 - 2024 — McMap. All rights reserved.