首页 > 解决方案 > delete[] 在析构函数中分配的内存抛出错误

问题描述

我无法调用delete[],因为它在析构函数中引发错误。下面带有注释的代码。

调试信息截图

class Packet
{
public:
    Packet(char* data, int len, ConnectionData* connectiont, int cmdtype) : _len(len), _connection(connectiont), _cmdtype(cmdtype)
    {
        _data = new char[len]; //allocate memory
        memcpy(_data, data, len); //copy to allocated memory
    }

    Packet() = default;

    ~Packet()
    {
        delete[] _data; /*error here*/
    }

private:
    char* _data;
    int _len, _cmdtype = 0;
    ConnectionData* _connection;
};


//Where create object of class and call constuctor.
char* _tempbuffer = new char[_templen];     
memcpy(_tempbuffer, _ph.getBuffer() + _temppos, _templen);

_separatedPackets.push_back(Packet(_tempbuffer, _templen, connection, _cmdtype));

标签: c++

解决方案


我将总结其他人提到的内容:

  1. 您有默认构造函数,没有_data属性的初始化程序,它可以指向任何东西,从而导致在尝试删除从未分配的内存时崩溃。
  2. 您(默认情况下)启用了复制构造函数以及operator =。这意味着您可能在Packet某个地方将一个实例分配给了另一个实例,并且很少有_data指针持有相同的地址,从而导致一旦这些数据包被释放,就会过度删除。

正确初始化和管理复制或完全删除默认构造函数、复制构造函数和赋值运算符的明显解决方案_data(请参阅 cpp 参考上的链接)。

另外,我建议使用std::vector<uint8_t>来存储数据、使用std::shared_ptrstd::weak_ptr保存指向对象的指针——你根本不会遇到这些问题。

编辑:关于您更新的代码 -vector.push_back()将制作Packet对象的副本,在删除数据之后也将删除临时对象。下一个Packet析构函数(在副本上)将过度删除内存。


推荐阅读