0x00051526处理未处理的异常访问冲突读取位置0x00000004

时间:2011-05-31 02:30:45

标签: c++ memory

class ByteBuffer
{
public:
    ByteBuffer(std::shared_ptr<uint8_t> buf, int len);
    explicit ByteBuffer(int len);
    virtual ~ByteBuffer(void);

    std::shared_ptr<uint8_t> getBuffer() const {return this->buffer;}
    uint16_t getLength() const {return this->length;}
private:
    std::shared_ptr<uint8_t> buffer;
    uint16_t length;
};

//-----------------------------------------------------------------------------
ByteBuffer::ByteBuffer(std::shared_ptr<uint8_t> buf, int len)
  : buffer(buf),length(len)
{ }

ByteBuffer::ByteBuffer(int len)
  : buffer(new uint8_t[len]),length(len)
{ }

ByteBuffer::~ByteBuffer(void)
{ }

//-----------------------------------------------------------------------------
class Packet
{
public:
    explicit Packet(ByteBuffer& ref);
    virtual ~Packet(void);
};

Packet::Packet(ByteBuffer& ref)
{
    // how do i intinlize it here so i can use it?
}

// i have onther method for the handling 
void HandlePacket(Packet & pack);
Handel(ByteBuffer & ref)
{
    Packet p(ref);
    HandlePacket(p); // the error happens here
}

编辑:对不起,我忘了添加错误发生的方法,我很抱歉

你可以看到2calsss,但是每次我试图在数据包内传递bytebuffer然后使用inther方法中的数据包它会给我这个错误:

  

AccountServer.exe中0x00051526处的未处理异常:0xC0000005:访问冲突读取位置0x00000004。

所以我的问题如何才能解决这个问题!?

1 个答案:

答案 0 :(得分:3)

您正在访问地址0x4。可能某个对象是NULL,您尝试使用ptr[1]->运算符取消引用它。

在调试器下运行您的程序,它将更清楚发生了什么。特别是它会给你一个堆栈跟踪并告诉你局部变量的状态。

正如评论中所提到的,由于new []shared_ptr不同,因此您无法将deletedelete []一起用于您所期望的方式。请参阅此网站,该网站位于Google搜索中:http://nealabq.com/blog/2008/12/02/array_deleter/。您需要一个delete []而不是默认值的客户删除工具,它只是delete