使用析构函数时双重自由或损坏

Shi*_*bli 5 c++ free destructor corruption

在下面的代码中,当我添加用箭头指定的行时给出错误:

"./a.out"出错:双重释放或损坏(fasttop):0x00000000007a7030 *已中止(核心转储)

如果我不使用析构函数,代码可以工作.任何的想法?

#include<iostream>
#include<vector>

struct Element
{
    int *vtx;

    ~Element ()
    {
        delete [] vtx;
    }
};

int main ()
{
    Element *elm = new Element [2];
    elm[0].vtx = new int [2]; // <----- adding this gives error

    std::vector <Element> vec;
    vec.push_back (elm[0]);
    vec.push_back (elm[0]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 6

当您添加elm[0]到时vec, 的副本elm[0]将存储在vec. 由于您还没有定义复制构造函数,因此编译器使用默认的复制构造函数——它逐个成员执行复制。在这种情况下,它保留指针的副本vtx。现在您有三个对象指向同一内存。

vec被破坏时,它会调用其中两个对象的析构函数。他们每个人都尝试 delete使用同一个指针。因此出现了错误。

如果您想避免此类错误,请查看“三法则”


Mau*_*rry 3

这是因为当您将元素推入向量时,您会复制它,但 vtx 在复制时不会重复,因此在 main() 结束时,您将拥有三个指向同一个 vtx 的元素。当程序终止时,它们三个都会尝试删除同一个 int 数组。