Я не понимаю, почему деструкторы вызываются дважды.
Из-за создания ненужных временных объектов здесь:
std::shared_ptr<Object> p1(make_shared<Object>(Object(123)));
^^^
temporary object
и здесь:
v.push_back(std::make_shared<Object>(Object(2)));
^^^
temporary object
Вместо этого должно быть
std::shared_ptr<Object> p1(make_shared<Object>(123));
и
v.push_back(std::make_shared<Object>(2));
Почему?
Потому что std::make_shared
создает объект типа T и помещает его в std :: shared_ptr, используя args в качестве списка параметров для конструктора T. И в вашем коде вы создаете один дополнительный объект, который немедленно уничтожается, вызывая деструктор .
Почему вы не видите, как конструктор Object(int n);
вызывается для временного объекта?
Object(int n);
конструктор действительно вызывается для временного объекта, но так как объект, удерживаемый std::shared_ptr
, создается с помощью конструктора копирования (поэтому, копируя временный объект), вы не увидите вызов Object(int n);
для него, а вызов Object(Object const& other);
.
В demo , вы можете увидеть первый Object(int n);
конструктор, вызываемый для временного объект, а затем вызов для копирования конструктора Object(Object const& other);
для фактического объекта, на который ссылается std::shared_ptr
.