In line a) you're creating 2 objects and you have the following method calls:
1) Default constructor for first object
2) Copy constructor for second object
In line b) you're creating 2 objects as well but you have the following method calls:
1) Default constructor for first object
2) Copy constructor for second object
3) Destructor for first object
So obviously the line a) works because the destructor is not called. It implies that most probably in line b) you're deallocating/freeing some resource (e.g. a dynamically allocated memory) in destructor and then trying to access that resource by the second object. In that case you need to implement the copy constructor properly. E.g. you need to allocate new memory/object in copy constructor instead of simply copying a pointer to memory/object.