c++ - delete[] 在析构函数中分配的内存抛出错误

标签 c++

<分区>

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

Screenshot of debug info

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));

最佳答案

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

  1. 你的默认构造函数没有 _data 的初始值设定项|属性,它可以指向任何东西,因此在尝试删除从未分配的内存时导致崩溃。
  2. 你有(默认)copy constructor启用以及operator = .这意味着您可能已经分配了一个 Packet实例到另一个地方并且很少_data一旦这些数据包被释放,持有相同地址的指针会导致过度删除。

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

此外,我建议使用 std::vector<uint8_t>要存储数据,请使用 std::shared_ptrstd::weak_ptr保存指向对象的指针 - 你根本不会有这些问题。

编辑:关于您更新的代码 - vector.push_back()将复制 Packet object, temporary object 也会在删除数据后被删除。下一页Packet析构函数(在拷贝上)将过度删除内存。

关于c++ - delete[] 在析构函数中分配的内存抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58316789/

相关文章:

c++ - c++ Clion 和 VS2019 中的纯虚拟析构函数

c++ - Cin对象返回值c++

c++ - 提交使用 OpenMP 的 R 包

c++ - 错误:预期的类名(链接列表C++)

c++ - 使用类中的另一个成员初始化成员数组的大小

c++ - 如何在 C++ 中将字符串与 const 字符串进行比较

c++ - strcmp 的段错误

c++ - 是什么导致我在 Qt 中的第一次机会(堆栈溢出)异常?

c++ - 如何增加int的大小

c++ - 阶乘 - 数组 - C++