我的数据包结构与此类似:
struct packet {
sockaddr_in m_Recv;
int m_iPacketSize;
unsigned char* m_ucpPacket;
}
这是我使用此结构的代码选择:
packet tOutPacket;
tOutPacket.m_Recv = tInPacket.m_Recv;
tOutPacket.m_iPacketSize = 256;
tOutPacket.m_ucpPacket = new unsigned char[256];
// Creating a uuid (not important how it's done, the pointer has 16 bytes)
unsigned char* uuid = NetworkHandlerN::ConnectionData::createUUID(hardware_hash);
NetworkHandlerN::PacketHandler::addUUIDToPacket(tOutPacket.m_ucpPacket, uuid);
delete[] uuid;
UDPsend(tOutPacket.m_Recv, tOutPacket.m_ucpPacket, tOutPacket.m_iPacketSize);
/* Delete pointer */
delete[] tOutPacket.m_ucpPacket; // This is causing an error
这是我的UDPsend方法:
bool NBsocket::UDPsend(sockaddr_in& AddrSento, const unsigned char* cucpBuffer, int iSize)
{
if(sendto(m_iSocket, reinterpret_cast<const char*>(cucpBuffer), iSize, 0, (sockaddr*) &AddrSento, sizeof(AddrSento)) == -1) {
m_iErrorCode = 6;
return false;
}
return true;
}
这是addUUIDToPacket方法:
static void addUUIDToPacket(unsigned char* ucpPacket, unsigned char* ucpChar)
{
for(int i = 0; i < ciUUIDSize; i++) {
ucpPacket[ciHeaderSize+i] = ucpChar[i];
}
}
首先我以为我在某处删除了指针tOutPacket.m_ucpPacket
,但我查了一下。如果我对这里存储的数据进行测试(就在delete[]
之前):
if(tOutPacket.m_ucpPacket[tOutPacket.m_iPacketSize-1] == 0x08)
std::cout << "0x08";
它完全正常(是的,值应该是0x08)
这是我的调用堆栈输出:
ntdll.dll!77dcfadc() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!77db4f92() Unknown
ntdll.dll!77d926fc() Unknown
ntdll.dll!77dd0b37() Unknown
ntdll.dll!77d8a967() Unknown
> msvcp110.dll!std::_Fputc<char>(char _Byte, _iobuf * _File) Line 83 C++
msvcp110.dll!std::basic_filebuf<char,std::char_traits<char> >::overflow(int _Meta) Line 383 C++
msvcp110.dll!std::basic_streambuf<char,std::char_traits<char> >::xsputn(const char * _Ptr, __int64 _Count) Line 406 C++
我已经测试了很多,但无法弄清楚出了什么问题。
希望有人可以帮助我。如果需要,我可以添加/* add data to packet */
部分,但这将是更多的代码。
修改
发现错误。我将一个字节传递给了这个方法:
static void addToPacket(unsigned char* ucpPacket, int iInt, int iPos)
{
ucpPacket[iPos+0] = iInt & 0xFF;
ucpPacket[iPos+1] = iInt >> 8 & 0xFF;
ucpPacket[iPos+2] = iInt >> 8 & 0xFF;
ucpPacket[iPos+3] = iInt >> 8 & 0xFF;
}
导致所有的touble ...太多的方法重载:)。一定是丢失了概述。
答案 0 :(得分:0)
在尝试实际查找错误及其原因之前,请考虑是否必须使用new []并删除[]。
尺寸是否固定为256?你能在结构中放一个常规数组吗?它并不是那么大。
假设没有,您可以使用std::vector<unsigned char>
吗?
如果不能,您可以使用boost::shared_array<unsigned char>
吗?您还必须将大小作为单独的元素(例如iPacketSize)。为此,您仍然会拨打new[]
,但会delete[]
进行处理。只要您需要使用的内存,就必须保留此shared_array
对象。
createUUID
做什么?它返回unsigned char *
但是谁拥有这个记忆?
您发送的数据在什么时候被复制?致电sendto
?