C++ 0x00051526访问冲突读取位置0x00000004处的未处理异常 class ByteBuffer { 公众: ByteBuffer(标准:共享的,内部的); 显式ByteBuffer(int-len); 虚~ByteBuffer(void); std::shared_ptr getBuffer()常量{返回此->缓冲区;} uint16_t getLength()常量{返回此->长度;} 私人: std::共享的ptr缓冲区; uint16_t长度; }; //----------------------------------------------------------------------------- ByteBuffer::ByteBuffer(标准::共享 :缓冲区(buf)、长度(len) { } ByteBuffer::ByteBuffer(int len) :缓冲区(新uint8_t[len]),长度(len) { } ByteBuffer::~ByteBuffer(无效) { } //----------------------------------------------------------------------------- 类包 { 公众: 显式数据包(ByteBuffer&ref); 虚拟数据包(void); }; 数据包::数据包(ByteBuffer和ref) { //我如何在这里初始化它以便使用它? } //我有另一种处理方法 空手提包(包和包); 汉德尔(比特布弗和参考) { 分组p(ref); HandlePacket(p);//错误发生在这里 }
编辑:对不起,我忘了添加发生错误的方法。我很抱歉 正如您所看到的2CALSS,但每次我试图在数据包内传递bytebuffer,然后在另一个方法上使用数据包内的bytebuffer时,都会出现以下错误: AccountServer.exe中0x00051526处的未处理异常:0xC0000005:访问冲突读取位置0x00000004C++ 0x00051526访问冲突读取位置0x00000004处的未处理异常 class ByteBuffer { 公众: ByteBuffer(标准:共享的,内部的); 显式ByteBuffer(int-len); 虚~ByteBuffer(void); std::shared_ptr getBuffer()常量{返回此->缓冲区;} uint16_t getLength()常量{返回此->长度;} 私人: std::共享的ptr缓冲区; uint16_t长度; }; //----------------------------------------------------------------------------- ByteBuffer::ByteBuffer(标准::共享 :缓冲区(buf)、长度(len) { } ByteBuffer::ByteBuffer(int len) :缓冲区(新uint8_t[len]),长度(len) { } ByteBuffer::~ByteBuffer(无效) { } //----------------------------------------------------------------------------- 类包 { 公众: 显式数据包(ByteBuffer&ref); 虚拟数据包(void); }; 数据包::数据包(ByteBuffer和ref) { //我如何在这里初始化它以便使用它? } //我有另一种处理方法 空手提包(包和包); 汉德尔(比特布弗和参考) { 分组p(ref); HandlePacket(p);//错误发生在这里 },c++,memory,C++,Memory,编辑:对不起,我忘了添加发生错误的方法。我很抱歉 正如您所看到的2CALSS,但每次我试图在数据包内传递bytebuffer,然后在另一个方法上使用数据包内的bytebuffer时,都会出现以下错误: AccountServer.exe中0x00051526处的未处理异常:0xC0000005:访问冲突读取位置0x00000004 那么我的问题是我如何解决这个问题 发生的情况是您正在访问地址0x4。可能某个对象是NULL,您尝试使用类似ptr[1]或->操作符的内容取消对它的引用 在调试器下运行
那么我的问题是我如何解决这个问题 发生的情况是您正在访问地址
0x4
。可能某个对象是NULL
,您尝试使用类似ptr[1]
或->
操作符的内容取消对它的引用
在调试器下运行您的程序,将会更清楚发生了什么。特别是,它将为您提供堆栈跟踪,并告诉您局部变量的状态
正如评论中提到的,您不能以您期望的方式将
new[]
与shared\u ptr
一起使用,因为delete
与delete[]
不同。请查看谷歌搜索中出现的网站:。您需要一个客户删除器,它执行delete[]
操作,而不是默认的delete
是什么让您认为shared_ptr
甚至可以与new[]分配的指针一起使用
没有自定义删除程序?@ildjarn shared\u ptr处理它,当它讨厌零时,它会自动删除它,这就是我使用smart的原因pointers@Mixed没有自定义删除程序的shared_ptr
不能用于删除分配给new[]的指针,使用shared_array
。只需使用std::vector
作为缓冲区(而不是ByteBuffer
),这正是它的用途。@frag:它总是未定义的行为,类型不重要<代码>新建
匹配删除
,新建[]
匹配删除[]
。
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
}