У меня есть DLL, которая экспортирует класс
class EMUDIAG_CLIENT_DLL CEmuDiagnosticsDLL
{
//...
CProjectDataFB *m_pProjectData;
//...
};
class CProjectDataFB
{
//...
WORD m_wErrorCode;
vector<EmuComputerData> m_emuComputerData;
//...
};
struct EmuComputerData
{
DWORD dwEmuComputerNo;
WORD wAPVecSize;
DWORD dwIPAddress;
vector<DWORD> apNumbers;
};
DLL выполняет свои собственные операции для заполнения m_wErrorCode
и m_emuComputerData
.
У меня есть один EXE, который содержит объект класса CEmuDiagnosticsDLL
и пытается получить m_wErrorCode
и m_emuComputerData
.
В режиме отладки я правильно получаю значения m_wErrorCode
и m_emuComputerData
.
В режиме Release значение для m_wErrorCode
прекрасное, но для m_emuComputerData
всегда 0.
Я не могу понять, что вызывает здесь проблему?
Пожалуйста, не входите в синтаксис/порядок определений классов здесь, как это указано для справки.
Размеры (и внутренняя структура) различных контейнеров STL могут различаться между сборками отладки и выпуска из-за дополнительных мер безопасности, используемых в отладочных сборках - особенно для MS Visual C++, например, здесь.
Я подозреваю причину, по которой вы видите это странное поведение, потому что DLL и основные приложения построены с другой конфигурацией (debug/release) или установкой этого макроса _HAS_ITERATOR_DEBUGGING
(показано в связанной теме форума). Тогда вам может посчастливиться вызвать только этот "размер кажется 0" проблемой, он также может просто сбой.
Решение заключается в том, чтобы всегда хранить как EXE, так и DLL-компоненты, созданные с той же конфигурацией (и, конечно же, одна и та же версия MSVC и т.д. - передача объектов C++ вокруг границ DLL непросто), или, возможно, изменение атератор отлаживает макрос вручную до требуемого значения.