Question: In the following code when I add the the line which is specified with an arrow gives error: 

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

The code works if I do not use destructor. Any idea?

```
#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;
}

```

Answer: 
When you add `elm[0]` to `vec`, copies of `elm[0]` are stored in `vec`. Since you haven't defined a copy constructor, the compiler used the default one -- which performs a member by member copy. In this case, it keeps a copy of the pointer `vtx`. Now you have three objects pointing to the same memory.

When `vec` gets destructed, it calls the destructor on two of those objects. They each try
`delete` on the same pointer. Hence the error.

If you want to avoid errors like these, check out [Rule of Three](http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29).
This is because you make copies of your Element when you push it in the vector, but the vtx is not duplicated on copy, so an the end of main(), you will have three Elements pointing to the same vtx. When the program terminates, all three of them will try to delete the same int array.