Short answer: you should not do this ... You need to make sure that the object is not used before it is deleted.
In terms of what the C ++ standard indicates, this is (possibly) undefined behavior - something unexpected may happen. The basis for this is that undefined behavior is used to use any member (function or variable) of an object after the destruction of the object. Of course, if the member function looks like this:
void foo::func() { for(;;) {
then this is NOT undefined behavior, and the stream can continue to work indefinitely, without any bad effect, and the clarity (I believe) is well defined (it just continues to work).
Of course, the execution of thread 1 will definitely not stop simply because the object is being deleted. That is, if the object does not actually contain the stream object for stream 1 - in this case, the destructor of the stream object can kill the stream.
In practice, if an object is deleted, its memory is freed, and the memory can be reused for some other object after some time. Depending on what the member function performs, for example, which parts of the object it refers to and how it uses these elements, it may cause a crash, or if it does something like x++; (where x is a member of a variable), it will change some memory that it no longer owns - and it can be quite difficult to debug, because it will look like something randomly changing other objects ... This is definitely NOT good ( and most likely it will happen only SOMETIMES, which makes it very difficult to determine when it will go wrong).
Nothing good will come of it.
You MUST make sure that the object is not used in any way to remove it. One way to do this, of course, is to have a thread object for thread 1 and kill the thread.