删除指针时出错

时间:2012-10-23 15:01:40

标签: c++ pointers

我的数据包结构与此类似:

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 ...太多的方法重载:)。一定是丢失了概述。

1 个答案:

答案 0 :(得分:0)

在尝试实际查找错误及其原因之前,请考虑是否必须使用new []并删除[]。

  1. 尺寸是否固定为256?你能在结构中放一个常规数组吗?它并不是那么大。

  2. 假设没有,您可以使用std::vector<unsigned char>吗?

  3. 如果不能,您可以使用boost::shared_array<unsigned char>吗?您还必须将大小作为单独的元素(例如iPacketSize)。为此,您仍然会拨打new[],但会delete[]进行处理。只要您需要使用的内存,就必须保留此shared_array对象。

  4. createUUID做什么?它返回unsigned char *但是谁拥有这个记忆?

    您发送的数据在什么时候被复制?致电sendto