Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Destructor vs member function race

When I'm inside a destructor is it possible that some other thread will start executing object's member function? How to deal with this situation?

like image 917
jackhab Avatar asked Jan 20 '09 16:01

jackhab


People also ask

Is destructor a member function?

A destructor is a member function that is invoked automatically when the object goes out of scope or is explicitly destroyed by a call to delete . A destructor has the same name as the class, preceded by a tilde ( ~ ).

How is destructor different from normal function?

Meaning, a destructor is the last function that is going to be called before an object is destroyed. Destructor is also a special member function like constructor. Destructor destroys the class objects created by constructor. Destructor has the same name as their class name preceded by a tilde (~) symbol.

Can we pass arguments in destructor?

A destructor takes no arguments and has no return type. Its address cannot be taken. Destructors cannot be declared const , volatile , const volatile or static . A destructor can be declared virtual or pure virtual .

Can a deconstructor return a value?

No, constructor does not return any value. While declaring a constructor you will not have anything like return type. In general, Constructor is implicitly called at the time of instantiation. And it is not a method, its sole purpose is to initialize the instance variables.


3 Answers

C++ has no intrinsic protection against using an object after it's been deleting - forget about race conditions - another thread could use your object after it's been completely deleted.

Either:

  1. Make sure only one place in the code owns the object, and it's responsible for deleting when no-one is using the object.
  2. Make the object reference counted - by added explicit reference counting code, or finding an appropriate base-class that implements reference counting
like image 163
Douglas Leeder Avatar answered Oct 05 '22 22:10

Douglas Leeder


You shouldn't be destroying an object unless you are sure that nothing else will be trying to use it - ideally nothing else has a reference to it. You will need to look more closely at when you call delete.

like image 23
DJClayworth Avatar answered Oct 05 '22 22:10

DJClayworth


In case are you in a destructor because of stack unwinding in exception handler, I suggest rearranging your code in such a way that you trap exceptions within a serialized block.

After the block you check if the object is still valid and call your method. That way the exception in one thread, will allow other threads to handle call to destructor gracefully.

like image 38
Sergey Golovchenko Avatar answered Oct 05 '22 22:10

Sergey Golovchenko