Объект создает другой экземпляр вместо изменения того, на который указывает - PullRequest
0 голосов
/ 16 января 2019

В моем основном у меня есть переменные:

ProcessManager mng;
MemoryManager mem;
dysk disk;

и я пытаюсь использовать эти указатели (также в основном)

std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem) ;
std::shared_ptr<dysk> wsk_d = std::make_shared<dysk>(disk);

чтобы передать эти объекты экземпляру моего другого объекта (через конструктор:

Interpreter interpreter(wsk,wsk_d);

но похоже, что intepreter создает свой собственный экземпляр диска, почему?

class Interpreter
{
private:
    std::shared_ptr<PCB> pcb;
    std::shared_ptr<MemoryManager> mm;
    std::shared_ptr<dysk> disk;
}

1 Ответ

0 голосов
/ 16 января 2019

Вот что 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; Или позволяя общему указателю обрабатывать полное владение (от создания до уничтожения) объекта.

И это действительно то, как вы должны смотреть на умные указатели, не как своего рода самоуничтожающийся указатель, а с точки зрения ресурса владения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...