将一个矢量复制到另一个矢量时崩溃
Crash while copying a vector to another
我有一个函数。在这里,我试图复制一个结构到另一个结构的相同类型。这个结构体作为一个向量存储在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);
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 尝试从另一个过程读取32位整数时,ReadProcessMemory崩溃了
- 为什么将对象从一个智能指针移至另一个原因崩溃
- Qopenglwidget将上下文移至另一个线程崩溃
- 在 jmpq 上崩溃到另一个 dll 中的函数与 mingw64
- Qt串行端口程序在另一个系统上运行时崩溃
- 带有字符串的UDT和VBA和C++之间的另一个UDT崩溃
- 类成员作为对另一个的引用:赋值运算符中的崩溃
- 另一个类中的自定义类实例数组使编译器崩溃
- "Magic static" 在另一个翻译单元的静态销毁阶段引用时单例崩溃
- 另一个程序在vector.push_back()上崩溃
- 类draw()方法在直接调用时有效,但在被另一个对象调用时崩溃
- QT c++在使用信号和槽从另一个类调用类的方法时崩溃
- 如果另一个线程导致进程在windows上崩溃,我该如何延迟销毁进程
- 将一个矢量复制到另一个矢量时崩溃
- 当UDF调用基于另一个UDF的输出时,Excel在用户定义的DLL上崩溃
- 将一个glm::vec3常量引用赋值给另一个glm::vec3时奇怪的崩溃