Во время инициализации моего класса 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
,
В чем может быть причина этой коррупции?
Дополнительная информация:
CGenericReport
принадлежит другому проекту DLL как CReport
перемещение его в тот же модуль не помогаетsizeof(SReportData)
= 44std::tstring
Тип определен std::wstring
Разные Выравнивание членов / отступы была проблема.
Я заметил, что через два модуля размером 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
одинаково для каждого модуля.
Других решений пока нет …