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。
所以我的问题如何才能解决这个问题!?
答案 0 :(得分:3)
您正在访问地址0x4
。可能某个对象是NULL
,您尝试使用ptr[1]
或->
运算符取消引用它。
在调试器下运行您的程序,它将更清楚发生了什么。特别是它会给你一个堆栈跟踪并告诉你局部变量的状态。
正如评论中所提到的,由于new []
与shared_ptr
不同,因此您无法将delete
与delete []
一起用于您所期望的方式。请参阅此网站,该网站位于Google搜索中:http://nealabq.com/blog/2008/12/02/array_deleter/。您需要一个delete []
而不是默认值的客户删除工具,它只是delete
。