提问人:BillyKlebitz 提问时间:10/24/2021 最后编辑:Vlad from MoscowBillyKlebitz 更新时间:10/24/2021 访问量:130
从矢量中删除对象会导致双重释放 [duplicate]
Erasing object from vector causes double free [duplicate]
问:
当我使用包含分配内存的类 B 向量时,会发生双重释放错误。
class B
{
public:
std::string a;
std::string b;
int *hehe;
B()
{
a = "Hello";
b = ", World!";
hehe = new int[7];
for (int i = 0; i < 7; ++i) {
hehe[i] = i;
}
}
~B() {
if (hehe)
delete[] hehe;
}
};
std::vector<class B> a(5);
a.erase(a.begin() + 2);
错误信息:
A.out(46830,0x10e0015c0) malloc:对象 0x7ff12dc02a80 的 *** 错误:未分配释放指针 a.out(46830,0x10e0015c0) malloc: *** 在malloc_error_break中设置断点进行调试
这段代码工作正常。我惊呆了。
std::vector<class B> a(1);
a.erase(a.begin());
答:
1赞
Vlad from Moscow
10/24/2021
#1
您没有定义复制构造函数或移动构造函数。因此,指针的相同值从一个对象复制到另一个对象,并且析构函数由于在多个对象中存储了相同的值,因此多次释放指针指向的内存。hehe
hehe
hehe
例如,复制构造函数可以按如下方式定义
B( const B &b ) : a( b.a ), b( b.b ), hehe( new int[7] )
{
for (int i = 0; i < 7; ++i) {
hehe[i] = b.hehe[i];
}
}
此外,您还需要显式定义复制分配运算符。
评论
new
new[]