S.Makesh
S.Makesh

Reputation: 21

C++ Passing class by value

When i run the following program in XCode Version 5.1.1,

#include <iostream>
class MyClass
{
public:
    MyClass() { std::cout << "MyClass Cons " << this << std::endl;}
    ~MyClass() { std::cout << "MyClass Dest " << this << std::endl;}

};
void Func(MyClass myClass)
{

}
int main(int argc, const char * argv[])
{
    MyClass myClass1;
    Func(myClass1);
    return 0;
}

The output i get is

MyClass Cons 0x7fff5fbff918
MyClass Dest 0x7fff5fbff910
MyClass Dest 0x7fff5fbff918

Why is the destructor triggering twice and constructor only once?

Upvotes: 2

Views: 279

Answers (3)

user4762317
user4762317

Reputation: 29

Here the object is constructed twice(as everyone mentioned above). Hence 2 constructor + 2 destructor are called. The reason you are seeing 1 constructor is because you have NOT defined the Copy Constructor. CC is called when a copy is made for the pass-by-value operation.

add the copy constructor and then you can see both the constructor called.

Add Copy constructor - MyClass(const MyClass& obj) { std::cout << "MyClass Copy Cons " << this << std::endl;}

Upvotes: 0

tillaert
tillaert

Reputation: 1845

The object is destroyed once, as you can see from the pointer values. You also see the destruction of another object. This object is a copy of the original.

By passing the object by value, the copy-constructor is invoked. Since this constructor does not print something, you do not see it in your output.

Add it to the class definition:

MyClass(const MyClass & other) { std::cout << "MyClass Copy-Cons " << this << " from " << &other << std::endl;}

And it should appear:

MyClass Cons 0x7fff1beee7ee
MyClass Copy-Cons 0x7fff1beee7ef from 0x7fff1beee7ee
MyClass Dest 0x7fff1beee7ef
MyClass Dest 0x7fff1beee7ee

The copy is created when you enter Func(). The copy is destroyed when it goes out of scope. This happens when you exit Func(). Finally, the original is destroyed when you exit the main() function.

Upvotes: 5

lakshmen
lakshmen

Reputation: 29064

The reason that you are seeing two destructor is because you are pass the arguments by value. Passing by value calls the copy constructor..

First Destructor:

At the end of the func function, the object goes out of scope, hence, it is destructed.

Second Destructor:

When the program end, the object is destructed.

My suggestion to remove the first destructor is to pass the object by reference rather than by value.

For example,

void Func(MyClass &myClass)
{

}

So now the output will have only:

MyClass Cons 0x7fff5fbff918
MyClass Dest 0x7fff5fbff918

Upvotes: 0

Related Questions