Why is the destructor getting called twice but the

2019-01-20 16:02发布

问题:

My code is

class CTemp{
public:
    CTemp(){
        printf("\nIn cons");
    }
    ~CTemp(){
        printf("\nIn dest");
    }
};

void Dowork(CTemp obj)
{
    printf("\nDo work");
}

int main()
{
    CTemp * obj = new CTemp();
    Dowork(*obj);
    delete obj;
    return 0;
}

The output that I get is

In cons
Do work
In dest
In dest

Now why does the constructor get called once but the destructor is called twice? Can someone please explain this?

回答1:

void Dowork(CTemp obj)

Here local-copy will be done, that will be destruct after exit from scope of DoWork function, that's why you see destructor-call.



回答2:

Implement a copy constructor and check again:

CTemp(const CTemp& rhs){
        printf("\nIn copy cons");
    }


回答3:

When the function is called its parameter is created by using the implicit copy constructor. Add to your class the following copy constructor

CTemp( const CTemp & ){
    printf("\nIn ccons");
}

to see one more message about creating an object



回答4:

You've missed to count a copy-constructor and expected a constructor instead.

CTemp * obj = new CTemp(); // It will call a constructor to make
                           // a pointer to a constructed object.

and

Dowork(*obj);              // It will copy `*obj` to the `Dowork` and copy-
                           // constructor will be called to make the argument

So, you have two objects and two destructor will be called.