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);//错误发生在这里 }

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);//错误发生在这里 },c++,memory,C++,Memory,编辑:对不起,我忘了添加发生错误的方法。我很抱歉 正如您所看到的2CALSS,但每次我试图在数据包内传递bytebuffer,然后在另一个方法上使用数据包内的bytebuffer时,都会出现以下错误: AccountServer.exe中0x00051526处的未处理异常:0xC0000005:访问冲突读取位置0x00000004 那么我的问题是我如何解决这个问题 发生的情况是您正在访问地址0x4。可能某个对象是NULL,您尝试使用类似ptr[1]或->操作符的内容取消对它的引用 在调试器下运行

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

正如您所看到的2CALSS,但每次我试图在数据包内传递bytebuffer,然后在另一个方法上使用数据包内的bytebuffer时,都会出现以下错误:

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


那么我的问题是我如何解决这个问题

发生的情况是您正在访问地址
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
}