c++ - 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));
解决方案
我将总结其他人提到的内容:
- 您有默认构造函数,没有
_data
属性的初始化程序,它可以指向任何东西,从而导致在尝试删除从未分配的内存时崩溃。 - 您(默认情况下)启用了复制构造函数以及operator =。这意味着您可能在
Packet
某个地方将一个实例分配给了另一个实例,并且很少有_data
指针持有相同的地址,从而导致一旦这些数据包被释放,就会过度删除。
正确初始化和管理复制或完全删除默认构造函数、复制构造函数和赋值运算符的明显解决方案_data
(请参阅 cpp 参考上的链接)。
另外,我建议使用std::vector<uint8_t>
来存储数据、使用std::shared_ptr
和std::weak_ptr
保存指向对象的指针——你根本不会遇到这些问题。
编辑:关于您更新的代码 -vector.push_back()
将制作Packet
对象的副本,在删除数据之后也将删除临时对象。下一个Packet
析构函数(在副本上)将过度删除内存。
推荐阅读
- c++ - 使用编译时类型和运行时函数创建 std::tuple
- google-sheets - 谷歌表格公式根据匹配条件查找缺失的数字
- reactjs - 下载超过 10mb React + Spring boot 的文件时出现“无法获取”错误
- database-connection - 连接池是否利用 SQL 页面缓存以及如何利用?
- mvvm - Dagger 2 + Service + Repository(Room DB+Cloud)
- swift - 修改 CVPixelBuffer
- c - 无法运行程序:collect2:错误:ld 返回 1 退出状态
- javascript - 如何在 Reactjs 中删除 cookie
- java - 实验室:登录名。如果超过一定数量的字符,则打印整个字符串时出错
- woocommerce - WooCommerce webhook 属性