将一个矢量复制到另一个矢量时崩溃

Crash while copying a vector to another

本文关键字:另一个 崩溃 复制 一个      更新时间:2023-10-16

我有一个函数。在这里,我试图复制一个结构到另一个结构的相同类型。这个结构体作为一个向量存储在CProjectData类中。当我试图复制内容时,它崩溃了。这段代码如下所示:

void CProjectData::send()
{
    struct  EmuComputerData tempStruct;
//ignore this line
m_pClient->GetTeleSend()->CreateHeader(GetFbMsgType(m_dwCmdId));
//ignore this line
CProjectData* pProjectdata = (CProjectData*) m_pClient->GetTeleSend()->AddBuffer(sizeof(CProjectData));
//ignore this line
pProjectdata->m_wErrorCode = m_wErrorCode;
//ignore this line
strcpy_s(pProjectdata->m_szProjectName, MAX_PROJECTNAME_LENGTH + 1, m_szProjectName);
vector<struct EmuComputerData>::iterator iter;
iter = m_emuComputerData.begin();
for (; iter != m_emuComputerData.end(); iter++)
{
    tempStruct.wEmuComputerNo = (*iter).wEmuComputerNo;
    tempStruct.dwIPAddress = (*iter).dwIPAddress;
    tempStruct.wPCCount = (*iter).wPCCount;
    vector<WORD>::iterator apIter;
    apIter = (*iter).apNumbers.begin();
    for (; apIter != (*iter).apNumbers.end(); apIter++)
    {
        tempStruct.apNumbers.push_back(*apIter);
    }
    //crashes after executing this line
    pProjectdata->m_emuComputerData.push_back(tempStruct);
}

}

m_emuComputerData声明为

vector<struct   EmuComputerData> m_emuComputerData;

ProjectData

这是一个包含向量的结构体。

 struct EmuComputerData
    {
    WORD        wPCCount;
    WORD        wEmuComputerNo;     
    DWORD       dwIPAddress;        
    vector<WORD>    apNumbers;          
    };

这是调用堆栈:当我试图复制vector<WORD> apNumbers时它崩溃了。我认为我在复制这个向量的时候做了一些愚蠢的事情。

msvcr90d.dll!operator delete(void * pUserData=0xcdcdcdcd)  Line 52 + 0x3 bytes  C++
    EmuDiagnosticsService.exe!std::allocator<EmuComputerData>::deallocate(EmuComputerData * _Ptr=0xcdcdcdcd, unsigned int __formal=0)  Line 140 + 0x9 bytes C++
    EmuDiagnosticsService.exe!std::vector<EmuComputerData,std::allocator<EmuComputerData> >::_Insert_n(std::_Vector_const_iterator<EmuComputerData,std::allocator<EmuComputerData> > _Where={wPCCount=??? wEmuComputerNo=??? dwIPAddress=??? ...}, unsigned int _Count=1, const EmuComputerData & _Val={...})  Line 1202    C++
    EmuDiagnosticsService.exe!std::vector<EmuComputerData,std::allocator<EmuComputerData> >::insert(std::_Vector_const_iterator<EmuComputerData,std::allocator<EmuComputerData> > _Where={wPCCount=??? wEmuComputerNo=??? dwIPAddress=??? ...}, const EmuComputerData & _Val={...})  Line 878   C++
    EmuDiagnosticsService.exe!std::vector<EmuComputerData,std::allocator<EmuComputerData> >::push_back(const EmuComputerData & _Val={...})  Line 823 + 0x58 bytes   C++
>   EmuDiagnosticsService.exe!CProjectData::send()  Line 574    C++
    EmuDiagnosticsService.exe!CEmuDiagTCPServer::Send()  Line 374 + 0xf bytes   C++
    EmuDiagnosticsService.exe!StartTCPServer(void * dummy=0x00000000)  Line 251 C++

谢谢

在拷贝运行之前,您可能有一些先前的损坏。被删除的指针——0xCDCDCDCD——是可疑的"常规",这表明它可能是一个哨兵值,编译器以某种方式放置在未初始化或已经释放的内存中(有这样的值的历史,也许最著名的是0xDEADBEEF)。

很可能是pProjectdata->m_emuComputerData变量没有正确初始化,或者已经被销毁了。CProjectData型似乎很可疑…AddBuffer似乎没有类型意识,这意味着CProjectData的构造函数没有运行;使用std::string,或strcpy_s代替sizeof m_szProjectName,会比MAX_PROJECTNAME_LENGTH + 1更可靠

FWIW, vector s可以用"值语义"复制,只要它们的内容也可以,所以这个代码:

vector<struct EmuComputerData>::iterator iter;
iter = m_emuComputerData.begin();
for (; iter != m_emuComputerData.end(); iter++)
{
    tempStruct.wEmuComputerNo = (*iter).wEmuComputerNo;
    tempStruct.dwIPAddress = (*iter).dwIPAddress;
    tempStruct.wPCCount = (*iter).wPCCount;
    vector<WORD>::iterator apIter;
    apIter = (*iter).apNumbers.begin();
    for (; apIter != (*iter).apNumbers.end(); apIter++)
    {
        tempStruct.apNumbers.push_back(*apIter);
    }
    //crashes after executing this line
    pProjectdata->m_emuComputerData.push_back(tempStruct);
}

可以简化为:

pProjectdata->m_emuComputerData.push_back(m_emuComputerData);