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?
问题:
回答1:
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:
- Make sure only one place in the code owns the object, and it's responsible for deleting when no-one is using the object.
- Make the object reference counted - by added explicit reference counting code, or finding an appropriate base-class that implements reference counting
回答2:
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.
回答3:
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.