class, virtual, sizeof

범하기 쉬운 실수
(CentOS 64비트 버전에서 테스트)

class A
{
    public:

        float a[3];

        A() {}
        ~A() {}
};

=> sizeof(A) = 12

class A
{
    public:

        float a[3];

        A() {}
        virtual ~A() {}
};

=> sizeof(A) = 24

특히 다음과 같이 해서는 절대로 안됨!

template <typename T>
class A
{
    public:

        T a[3];

        A() {}
        virtual ~A() { memset( a, 0, sizeof(T)*3 ); }
};

virtual function을 가지고 있는 struct, class에서는 절대 memset으로 초기화를 해서는 안된다!
virtual 사용시, 실제 data 크기 이외에 실행함수 주소를 저장할 공간을 추가적으로 가지기 때문이다.

Tags:,

Add a Comment