使用包含已分配内存的B类vector时,会发生双自由错误。
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());
您没有定义复制构造函数或移动构造函数。因此,指针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];
}
}
还需要显式定义复制赋值操作符。