Член поврежден при инициализации следующего члена

Во время инициализации моего класса CTestController член std :: vector искажается, и я понятия не имею, что вызывает такое поведение.

Ситуация выглядит следующим образом:

class TestController
{
// ...
CReport m_report;
CTestInspector m_testInspector;
// ...
}

Эти члены неявно создаются в конструкторе CTestController,

class CReport : public CGenericReport
{
// ...
std::vector<SReportData> m_data;
}

а также

class CGenericReport
{
// ...
COLORREF m_bgColor;
const short m_dmOrient;
long m_defaultCX;
long m_defaultCY;
CWnd m_wnd;
}

m_data последний элемент члена CReport, Он правильно инициализируется с размером = емкость = 0.

Ничего особенного в структуре:

struct SReportData
{
CPoint pos;
std::tstring text;
int fontType;
COLORREF color;
};

После инициализации m_data в CReport Я сохраняю адрес его _Myend указатель:
0x03D84500
Точка останова данных в этом месте немедленно попадает в конструктор CTestInspectorкогда член m_testInspector в CTestController находится в (&m_testInspector):
0x03D84502!
Это портит _Myend указатель, приводящий к ошибочному capacity (например, 3014656) в CReport.m_data,

В чем может быть причина этой коррупции?

Дополнительная информация:

  • Очистить / восстановить не помогает
  • Я использую MFC и Unicode
  • Та же проблема после обновления до Visual Studio 2013
  • CGenericReport принадлежит другому проекту DLL как CReportперемещение его в тот же модуль не помогает
  • sizeof(SReportData) = 44
  • std::tstring Тип определен std::wstring

2

Решение

Разные Выравнивание членов / отступы была проблема.

Я заметил, что через два модуля размером CGenericReport был другим: 136 против 134, включая тот же заголовочный файл.

В одном случае m_defaultCX член был расположен сразу после 2-х байтового члена m_dmOrient в то время как в другом модуле было добавлено 2 байта для выравнивания до 8 байтов.

Затем я проверил настройки выравнивания в свойствах проекта (/ Zp, Выравнивание членов структуры во вкладке Генерация кода в C / C ++). Оба были настроены на По умолчанию (= 8 байт согласно документации).
Тем не менее, когда я вставил

#pragma pack(show)

в CGenericReport заголовочный файл, сообщил компилятор

warning C4810: value of pragma pack(show) == 8
...
warning C4810: value of pragma pack(show) == 1

для этого места в разном порядке.

Наконец я вата #pragma pack директива

#pragma pack(1)

используется в конце другого заголовка, который переопределяет настройки проекта и вызывает такое поведение.
Удаление этого освободило меня от этой проблемы. Теперь выравнивание упаковки CGenericReport одинаково для каждого модуля.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]