В Windows сокет является связующим звеном между конечной точкой связи и процессом. Вот почему, когда вы дублируете сокет, вы получаете два сокета, но только одну конечную точку. Вот почему вы не можете передать сокет из одного процесса в другой, не создав новый сокет в другом процессе.
Если процесс перестает существовать, его сокеты обязательно прекращают существовать. Не существует концепции сокета без процесса его удержания. Вот почему даже драйверы ядра Windows, которые хотят создавать сокеты на уровне ядра, должны указывать процесс для владения сокетом или вызывать функцию из контекста процесса, который может владеть сокетом. (Или они могут управлять конечными точками напрямую, без использования сокетов.)
Ваш вопрос, похоже, на самом деле касается не сокетов, а самих конечных точек связи. Сокет имеет ссылку на свою конечную точку связи. Когда сокет исчезает, счетчик ссылок падает. Если он достигнет нуля, он будет удален, как только это допустимо, учитывая требования протокола связи, с которым связана конечная точка. TCP имеет состояние TIME_WAIT, во время которого конечная точка должна поддерживаться для обработки любых «оставшихся» пакетов.