从向量中删除对象会导致双重释放

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];
    }
}

您还需要明确定义复制赋值运算符。