在释放模式下访问时矢量大小为0

Vector size is 0 while accessing in Release mode

本文关键字:小为 释放 模式 访问      更新时间:2023-10-16

我有一个导出类的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

我有一个EXE,其中包含CEmuDiagnosticsDLL类的对象,并试图获得m_wErrorCodem_emuComputerData
在调试模式下,我得到值m_wErrorCodem_emuComputerData正确。
在释放模式下,m_wErrorCode的值是好的,但m_emuComputerData的值总是0。

我不知道是什么导致这里的问题?

请不要在这里讨论类定义的语法/顺序,因为这是为了参考而提到的。

各种STL容器的大小(和内部结构)在调试版本和发布版本之间可能会有所不同,因为在调试版本中使用了额外的安全措施——特别是对于MS Visual c++,请参见此处的示例。

我怀疑你看到这种奇怪行为的原因是因为DLL和主要应用程序是用不同的配置(调试/发布)或_HAS_ITERATOR_DEBUGGING宏的设置构建的(在链接的论坛线程中显示)。那么你可能很幸运地触发了这个"size似乎是0"的问题,它也可能简单地崩溃。

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