Размер вектора равен 0 при доступе в режиме Release [закрыт]

0

У меня есть 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.

Я не могу понять, что вызывает здесь проблему?

Пожалуйста, не входите в синтаксис/порядок определений классов здесь, как это указано для справки.

Теги:
vector
stl

1 ответ

2
Лучший ответ

Размеры (и внутренняя структура) различных контейнеров STL могут различаться между сборками отладки и выпуска из-за дополнительных мер безопасности, используемых в отладочных сборках - особенно для MS Visual C++, например, здесь.

Я подозреваю причину, по которой вы видите это странное поведение, потому что DLL и основные приложения построены с другой конфигурацией (debug/release) или установкой этого макроса _HAS_ITERATOR_DEBUGGING (показано в связанной теме форума). Тогда вам может посчастливиться вызвать только этот "размер кажется 0" проблемой, он также может просто сбой.

Решение заключается в том, чтобы всегда хранить как EXE, так и DLL-компоненты, созданные с той же конфигурацией (и, конечно же, одна и та же версия MSVC и т.д. - передача объектов C++ вокруг границ DLL непросто), или, возможно, изменение атератор отлаживает макрос вручную до требуемого значения.

  • 0
    Огромное спасибо ... Ваше предложение решило много проблем :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню