Я столкнулся с проблемой при работе с c ++ над Linux.
У меня есть базовый класс Message, который выглядит следующим образом:
class MsgBase
{
public:
MsgBase( unsigned int msgid );
map < unsigned int, MSGIEBase* > messageIE_Map; // map for IEs
unsigned int messageId; // 32 bit message id
};
класс Der1 является производным от MsgBase и выглядитнапример:
class Der1 : public MsgBase
{
public:
Der1 ();
virtual ~Der1 ();
// IEs
MSGIE_UINT32 ueId;
MSGIE_String configFileName;
};
Здесь MSGIE_UINT32 и MSGIE_String являются классами, производными от MSGIEBase, и поэтому их адрес может быть сохранен в карте, определенной в базовом классе выше.Когда Der1 создан, адрес ueId и configFileName сохраняется на карте.Здесь, если я напечатаю размер карты (через gdb и в программе), он будет равен 24. [_M_header = 16, _M_node_count = 4, _M_key_compare = 1, 3 байта, я полагаю].
До здесьВсе отлично.Теперь указатель объекта Der1 помещается внутри объекта события, а событие отправляется в очередь.Класс события выглядит следующим образом:
class Event
{
public:
MsgBase* msgPtr;
};
Другой поток удаляет событие из очереди, извлекает msgPtr и помещает его в указатель Der1, и именно здесь начинается проблема.
Здесь, еслиЯ печатаю размер карты в программе, равный 21. Это означает, что адрес следующего члена в классе MsgBase, т.е. messageId, сдвигается на 3 байта, и поэтому значение messageId изменяется полностью.(при просмотре через gdb адрес все еще остается неизменным, как и размер карты, т. е. 24).
Насколько мне известно, это вопрос выравнивания слов, но почему выравнивание памяти не согласовано вразличные функции и почему адрес члена класса chage, когда память для класса была выделена с помощью new.Я использую Linux 2.6.27., версия gcc 4.1.1., RHEL-4.