C++ 将向量复制到另一个向量时崩溃

C++ 将向量复制到另一个向量时崩溃,c++,stl,stdvector,C++,Stl,Stdvector,我有一个功能。在本文中,我试图将一个结构复制到另一个相同类型的结构。此结构作为向量存储在CProjectData类中。 当我试图复制内容时,它崩溃了。代码如下所示: void CProjectData::send() { struct EmuComputerData tempStruct; //ignore this line m_pClient->GetTeleSend()->CreateHeader(GetFbMsgType(m_dwCmdId)); //ignore

我有一个功能。在本文中,我试图将一个结构复制到另一个相同类型的结构。此结构作为向量存储在
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);
}
ProjectData
类中

这是一个同样包含向量的结构

 struct EmuComputerData
    {
    WORD        wPCCount;
    WORD        wEmuComputerNo;     
    DWORD       dwIPAddress;        
    vector<WORD>    apNumbers;          
    };
struct emu计算机数据
{
单词wPCCount;
单词wEmuComputerNo;
DWORD dwIPAddress;
向量数;
};
这里是调用堆栈:当我尝试复制
向量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++
msvcr90d.dll!运算符删除(Vult*PUSEDATABAS= 0xCDCDCDCD)行52 +0x3字节C++
EmuDiagnosticsService.exe!分配::DeloPoint(EuMeCtudioDATA,*PTR=0xCDCDCDCD,无符号int×Salm=0)行140 +0x9字节C++
EmuDiagnosticsService.exe!St::vector::插入插件(STD::{VC++),{= WPCUnC==??WEMUCUTHON= =???DWIPAd= =???…},无符号int yCt=1,const EMuCudioDATA和yVal= {…} 1202行C++
EmuDiagnosticsService.exe!STD::vector:插入(STD:OpthVector),其中{{WPCCOUNT=??WEMUCUTHON= =????DWIPAd= =??…},const EMUCUMEDATA数据和YAVAL={}} 878行C++
EmuDiagnosticsService.exe!STD::向量:推送(const EntualDATA和VaY= {…})行823 +0x58字节C++
>EmuDiagnosticsService.exe!CjEngDATAs::Sead()第574行C++
EmuDiagnosticsService.exe!SeUnAdTcTCPServer::Sead()行374 +0xf字节C++
EmuDiagnosticsService.exe!StuttCPSServer(虚空*虚拟= 0x00亿)251线C++
谢谢

Nipun

在拷贝运行之前,您可能有一些先前的损坏。被删除的指针0xCDCDCD是可疑的“常规”指针,这表明它可能是编译器不知何故放置在未初始化或已释放内存中的哨兵值(有此类值的历史记录,其中最著名的可能是0xDEADBEEF)

很可能是
pProjectdata->m_emuComputerData
变量没有正确初始化,或者已经被销毁。
CProjectData
类型似乎可疑
AddBuffer
似乎不知道类型,这意味着
CProjectData
的构造函数没有运行;使用
std::string
strcpy\u s
作为m_szProjectName的
sizeof m_szProjectName
,将比
MAX_PROJECTNAME\u 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);
}

有没有可能
p项目数据
实际上就是
这个
?这就意味着你正在往你正在阅读的同一个向量推进,这会引起麻烦。我已经尝试了你在最后一行中的建议,但结果是一样的。。。Crash@Nipun正如我所说,这是事先的内存损坏,和复制无关。。。这些代码就在那里——FWIW(不管它值多少)——作为一般编程反馈。使用valgrind之类的工具是搜索实际错误的一种有效方法,但是将
cerr
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);