This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Failure in sizeof() function while using Member-Function-Pointers

When using member-function-pointers I noticed that they have a size of 8Bytes each. However when I ask the compiler it says it is only 4Bytes. Having a couple of objects in you program which have member-function-pointers and are created dynamically with new will allways crash your program.

Please refer to the following source-code and documentation:


#include  <StdIO.h>
#include  <Reg164ci.h>

/*
        A simple external object
        */
class cCalculator {

        public:
                int calculate();

};

int cCalculator::calculate(){
        return 27;
}

/*
        The description of the member-function-pointer
*/
typedef int (cCalculator::*fptr)();



/*
        An object with an array of such member-function-pointers
        which is able to call these functions by an index.
*/
class cAnObject  {
public:
   cAnObject();
         ~cAnObject();

         fptr fptr_array[2];    // 2 x 8 bytes = 16 bytes (see watchwindow)

        int   member1;                  // 2 bytes
        int       member2;              // 2 bytes

                                        // --------------------------------------
                                        // total: 20bytes = 0x14bytes

};
/*
        The constructor
*/

cAnObject::cAnObject()  {
  member1 = 1;
  member1 = 2;
}

/*
        The destructor
*/
cAnObject::~cAnObject()  {
  member1 = 0;
  member1 = 0;
}

int main (void)  {

        // now we have the external object
        cCalculator calc1;
        cCalculator calc2;

        // and a couple of objects containing some function pointes
        cAnObject test1;
        cAnObject test2;
        cAnObject test3;

        fptr memberfunction = &(cCalculator::calculate);
        test1.fptr_array[0] =  memberfunction;


        // here we get the size of our objects (see watch window)
        volatile unsigned long object_addr1 = (unsigned long) &test1;
        volatile unsigned long object_addr2 = (unsigned long) &test2;
        volatile unsigned long object_sizeA = object_addr2 - object_addr1;
        volatile unsigned long object_sizeB = sizeof( test1 );
        //...

        // please notice that the static objects have a distance
        // which is different from its size ? why?
        // count the bytes and you see the sizeof() is wrong !!


        // now we simply create the dynamic object (with the wrong size), why ? compiler ?
        // which here leads to an -access violation-, due to
        // the wrong calculated size of the function pointers
        cAnObject * p_test4;
        p_test4 = new cAnObject;
        // and set the function
        p_test4->fptr_array[0] = memberfunction;

        // calc the size
        volatile unsigned long objectSize4 = sizeof(    (*p_test4)      );


        // ----
        // now the function call itself
        cCalculator * p_calc;

        // here we select our target object
        p_calc = &calc1;

        // do the static object call by an index == 0
        fptr p_fct1 = test1.fptr_array[0];
        int x = ( (p_calc)->*( p_fct1 ))( );

        // now use the other object
        p_calc = &calc2;

        // do the dynamic object call   by an index == 0
        fptr p_fct4 = p_test4->fptr_array[0];
        int y = ( (p_calc)->*( p_fct4 ))( );


        // if there is any time please notice that there is a second bug:
        //   try to remove the line "fptr p_fct4 = ..."
        //       and put it into one line like "   int y = ( (p_calc)->*( p_test4->fptr_array[0] ))( );      "
        // and your whole program will crash !

        // just print the result
        printf("%d = %d \r", x, y );

  while (1);
}

Parents
  • // please notice that the static objects have a distance
    // which is different from its size ? why?

    Why not?

    // count the bytes and you see the sizeof() is wrong !!

    You have nowhere near enough proof to back such an outrageous claim. There's no rule forcing the tools to locate individual variables in memory like you assume it must.

Reply
  • // please notice that the static objects have a distance
    // which is different from its size ? why?

    Why not?

    // count the bytes and you see the sizeof() is wrong !!

    You have nowhere near enough proof to back such an outrageous claim. There's no rule forcing the tools to locate individual variables in memory like you assume it must.

Children
No data