dimanche 22 février 2015

initialization of class member in anonymous union

I have observed that the following code segfaults at the line ar.p():



#include <iostream>

class A
{
public:
virtual void p() { std::cout<<"A!\n"; }
};

class B : public A
{
public:
void p() { std::cout<<"B!\n"; }
};

struct Param
{
enum {AA, BB} tag;
union {
A a;
B b;
};

Param(const A &p)
: tag(AA) {a = p;}

A &get() {
switch(tag) {
case AA: return a;
case BB: return b;
}
}
};

int main() {
A a;
a.p();
Param u(a);
A &ar = u.get();
ar.p();
}


However, when I change the Param constructor to:



Param(const A &p)
: tag(AA), a(p) {}


it does not segfault anymore.


I think it has something to do with the way the vtable ptr for union member a is initialized, but I'd like to understand this bug better.


Thanks for your help.


Aucun commentaire:

Enregistrer un commentaire