Вот что std::make_shared
делает : создайте новый объект, используя переданные аргументы для передачи в подходящий конструктор. В вашем случае копи-конструктор.
То есть утверждение
std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem);
эквивалентно
std::shared_ptr<MemoryManager> wsk(new MemoryManager(mem));
Если вы хотите, чтобы ваш общий указатель ссылался на существующий объект, вам нужно использовать, например,
std::shared_ptr<MemoryManager> wsk(&mem);
Но это принесет с собой другие проблемы, поскольку, когда последний общий указатель будет уничтожен, он попытается освободить память, что невозможно для объекта, не созданного new
. Есть два решения для этого: либо создать (или использовать существующий) null-deleter , который на самом деле ничего не delete
; Или позволяя общему указателю обрабатывать полное владение (от создания до уничтожения) объекта.
И это действительно то, как вы должны смотреть на умные указатели, не как своего рода самоуничтожающийся указатель, а с точки зрения ресурса владения .