关于c ++:使用析构函数时双重自由或损坏

Double free or corruption when using destructor

本问题已经有最佳答案,请猛点这里访问。

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

Error in `./a.out': double free or corruption (fasttop):
0x00000000007a7030 * Aborted (core dumped)

如果我不使用析构函数,代码就可以工作。知道吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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;
}


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

vec被销毁时,它调用其中两个对象的析构函数。他们每一次尝试同一指针上的delete。因此出现了错误。

如果你想避免这样的错误,请看三条规则。


这是因为在向量中推送元素时会复制元素,但在复制时不会复制vtx,所以在main()的末尾,您将有三个元素指向同一个vtx。当程序终止时,它们三个都将尝试删除相同的int数组。