Почему shared_ptr не конфликтует с HANDLE из WinAPI? С++
Я решил сделать обертку для HANDLE из WinAPI, который представляет из себя void*. Нужная мне обертка использовалась бы с функцией OpenProcess(), которая возвращает HANDLE открытого процесса. Обертка выглядит так:
using Handle = std::shared_ptr<std::remove_pointer_t<HANDLE>>;
typedef struct SharedHandle : Handle {
using Handle::shared_ptr;
SharedHandle(HANDLE ptr)
: Handle::shared_ptr(ptr, CloseHandle) {}
} SHandle;
То есть по сути это shared_ptr<void>, только с делитером, который представляет из себя WinAPI функцию CloseHandle. И тут я подумал, что если создать два таких указателя к одному процессу, то у нас создадутся два shared_ptr, которые указывают на одно и то же место, но друг о друге ничего не знают. Согласно документации это ведет к UB:
// После выхода из области видимости они попытаются вызвать делитер CloseHandle
// Дважды на одном указателе, что ведет к UB
SharedHandle handle = OpenProcess(PROCESS_ALL_ACCESS, NULL, process_id) // 1
SharedHandle handle2 = OpenProcess(PROCESS_ALL_ACCESS, NULL, process_id) // 2
Однако этого не произошло! Я начал копать и вывел значение указателя, которое возвращает OpenProcess. Мне вывело два совершенно разных адреса! Хотя id процесса был один и тот же. Почему OpenProcess возвращает различные handl'ы для одного процесса и насколько вероятен исход, что рано или поздно вернет два одинаковых указатели и shared_ptr вызовет ошибку?