Pages

Thursday, July 23, 2009

C++ классы: размещение в памяти. Часть II.

Запустим одну из этих програм и остановим в дебаггере, чтобы посмотреть один какой-то экземпляр класса:

В окне просмотра памяти находится область &objCharArray = 0x0012FF1C. Виден блок не инициализированной памяти – несколько строк с 0xCC. Это массив x[24]. Чтобы убедится, запишем в него слово и проверим в дебаггере еще раз.

#include <stdio.h>
#include <Windows.h>
class CCharArray
{
char x[24];
public:
CCharArray()
{
strcpy(x, "Hello");
}
void method()
{
printf("method\r\n");
}
};
int main()
{
CInt objInt;
printf("size of CInt object is %d\r\n", sizeof(objInt));
CDouble objDouble;
printf("size of CDouble object is %d\r\n", sizeof(objDouble));
CChar objChar;
printf("size of CChar object is %d\r\n", sizeof(objChar));
CCharArray objCharArray;
printf("size of CCharArray object is %d\r\n", sizeof(objCharArray));
return 0;
}



“Hello” записано в начале памяти отведенной для объекта objCharArray.
Студия находит внутренние переменные и показывает их. А это и не сложно. Вот программа, которая имеет "ошибку" (printf получил параметром класс вместо "ожидаемого" числа целого типа) и тоже показывает скрытые переменные класса:

#include <stdio.h>
#include <Windows.h>
class CInt
{
int x;
public:
CInt() : x(123) {}
};
class CCharArray
{
char x[24];
public:
CCharArray()
{
strcpy(x, "Hello");
}
};
int main()
{
CInt objInt;
printf("size of CInt object is %d\r\n", sizeof(objInt));
printf("CInt as integer %d\r\n", &objInt);
CCharArray objCharArray;
printf("size of CCharArray object is %d\r\n", sizeof(objCharArray));
printf("CCharArray as string is %s\r\n", &objCharArray);
return 0;
}



А ведь стандартный С++ говорит, что это private переменная и доступа к ней нет.

А вот так вторую и третью переменные из класса вывести на экран можна:

#include <stdio.h>
#include <Windows.h>
class CInt
{
int x;
int y;
int z;
public:
CInt() : x(123), y(456), z(789) {}
};
int main()
{
CInt objInt;
printf("size of CInt object is %d\r\n", sizeof(objInt));
printf("CInt: first private member %d\r\n", objInt);
printf("CInt: second private member %d\r\n", *((int*)&objInt + 1));
printf("CInt: third private member %d\r\n", *((int*)&objInt + 2));
return 0;
}


No comments:

Post a Comment