Terminating process or process simply crashing (because or bug or whatever) is completely different story. In such case usually no cleanup code runs at all. So there is no way to signal other process that it shouldn't wait on my. For example, if code is structured like this:
| while (running)
{
...
}
SendMessageToOtherProcessSoItKnowsItShouldCleanUpMyResources();
|
Then killing it when while loop is executing won't call that SendMessage function. And your printer will still show stuck document in queue.
Similarly if process cleans up some resources in global C++ destructors or C atexit callback - those things won't run when process crashes or you are killing it. As long as regular resources (memory, handles, threads, etc..) are deallocated, everything will be ok.