Почему 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 вызовет ошибку?


Ответы (0 шт):