在发布模式下访问时,矢量大小为0

时间:2014-06-03 11:32:03

标签: c++ vector stl

我有一个导出类

的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_wErrorCodem_emuComputerData

我有一个包含CEmuDiagnosticsDLL类对象的EXE,并尝试获取m_wErrorCodem_emuComputerData
在调试模式下,我正确获得值m_wErrorCodem_emuComputerData 在发布模式下,m_wErrorCode的值很好,但m_emuComputerData的值始终为0.

我无法弄清楚造成问题的原因在哪里?

请不要在此处进入类定义的语法/顺序,因为这是为了参考提供的。

1 个答案:

答案 0 :(得分:2)

各种STL容器的大小(和内部结构)可能因调试版本中使用的额外安全措施而在调试和发布版本之间有所不同 - 特别是对于MS Visual C ++,请参阅例如here

我怀疑您看到这种奇怪行为的原因是因为DLL和主应用程序是使用不同的配置(调试/发布)或设置_HAS_ITERATOR_DEBUGGING宏(在链接的论坛帖子中显示)构建的。然后你可能会幸运地触发这个&#34;大小似乎是0&#34;问题,它也可能只是崩溃。

然后解决方案是始终保持使用相同配置构建的EXE和DLL部件(当然,相同版本的MSVC等 - 跨越DLL边界传递C ++对象并不容易),或者可能手动将迭代器调试宏更改为所需的值。