Вы можете решить проблему двойного удаления несколькими способами.
Если вы знаете, что хотите, чтобы время жизни объекта контролировалось одним unique_ptr, вы можете создать простой наблюдатель_ptr, который будет содержать указатель, но не попытка уничтожить объект:
// a deleter that will not delete
struct no_delete
{
template<class P>
void operator()(P*) const noexcept
{
// nothing;
}
};
template<class T>
using observer_ptr = std::unique_ptr<T, no_delete>;
Если вы хотите, чтобы время жизни объекта заканчивалось, когда последний из указателей выходит из области видимости, и вы не знаете, какой из них будет go сначала из области видимости, затем вы захотите std::shared_ptr
https://godbolt.org/z/vrXzFT