从矢量中删除对象会导致双重释放 [duplicate]

Erasing object from vector causes double free [duplicate]

提问人:BillyKlebitz 提问时间:10/24/2021 最后编辑:Vlad from MoscowBillyKlebitz 更新时间:10/24/2021 访问量:130

问:

当我使用包含分配内存的类 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());
C++ Vector dynamic-memory-allocation free copy-constructor

评论

0赞 PaulMcKenzie 10/24/2021
我惊呆了——违反了 3 法则。转到重复链接,然后转到标记为“管理资源”的部分,该示例看起来很熟悉吗?
0赞 Eljay 10/24/2021
在现代 C++ 中,几乎没有必要使用 OR(在过去的 10 年中我没有直接使用过)。使用为您管理资源的容器和智能指针。newnew[]

答:

1赞 Vlad from Moscow 10/24/2021 #1

您没有定义复制构造函数或移动构造函数。因此,指针的相同值从一个对象复制到另一个对象,并且析构函数由于在多个对象中存储了相同的值,因此多次释放指针指向的内存。hehehehehehe

例如,复制构造函数可以按如下方式定义

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

此外,您还需要显式定义复制分配运算符。