我有一个导出类
的DLLclass 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
。
我有一个包含CEmuDiagnosticsDLL
类对象的EXE,并尝试获取m_wErrorCode
和m_emuComputerData
。
在调试模式下,我正确获得值m_wErrorCode
和m_emuComputerData
在发布模式下,m_wErrorCode
的值很好,但m_emuComputerData
的值始终为0.
我无法弄清楚造成问题的原因在哪里?
请不要在此处进入类定义的语法/顺序,因为这是为了参考提供的。
答案 0 :(得分:2)
各种STL容器的大小(和内部结构)可能因调试版本中使用的额外安全措施而在调试和发布版本之间有所不同 - 特别是对于MS Visual C ++,请参阅例如here
我怀疑您看到这种奇怪行为的原因是因为DLL和主应用程序是使用不同的配置(调试/发布)或设置_HAS_ITERATOR_DEBUGGING
宏(在链接的论坛帖子中显示)构建的。然后你可能会幸运地触发这个&#34;大小似乎是0&#34;问题,它也可能只是崩溃。
然后解决方案是始终保持使用相同配置构建的EXE和DLL部件(当然,相同版本的MSVC等 - 跨越DLL边界传递C ++对象并不容易),或者可能手动将迭代器调试宏更改为所需的值。