从向量中删除对象会导致双重释放
Erasing object from vector causes double free
当我使用包含已分配内存的 class 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: *** error for object 0x7ff12dc02a80: pointer being freed was not allocated
a.out(46830,0x10e0015c0) malloc: *** set a breakpoint in malloc_error_break to debug
这段代码运行良好。我惊呆了。
std::vector<class B> a(1);
a.erase(a.begin());
您没有定义复制构造函数或移动构造函数。因此,指针 hehe
的相同值从一个对象复制到另一个对象,并且由于存储了 [=11] 的相同值,析构函数多次释放指针 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];
}
}
您还需要明确定义复制赋值运算符。
当我使用包含已分配内存的 class 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: *** error for object 0x7ff12dc02a80: pointer being freed was not allocated a.out(46830,0x10e0015c0) malloc: *** set a breakpoint in malloc_error_break to debug
这段代码运行良好。我惊呆了。
std::vector<class B> a(1);
a.erase(a.begin());
您没有定义复制构造函数或移动构造函数。因此,指针 hehe
的相同值从一个对象复制到另一个对象,并且由于存储了 [=11] 的相同值,析构函数多次释放指针 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];
}
}
您还需要明确定义复制赋值运算符。