NIKr0m@nceR Wrote:Неэффективный но рабочий способ с явным вызовом конструктора
Копировать временный указатель на новый объект в куче? Хм, а ведь действительно вариант... Спасибо, что-то я затупил. Ещё можно пользоваться функцией std::make_shared, но она заодно осуществляет копирование объекта О ней я, наверное, позже напишу.
Пока что интересует такой вопрос. Есть такой код: (Click to View)
PHP Code:
#include <iostream> #include <memory>
class Test { public: Test() { std::cout << "Test default ctor" << std::endl; }
{ Test* t = new Test(); // создали объект в куче std::shared_ptr<Test> sh(t); // создали указатель на этот объект }
return 0; }
Вывод приложения таков:
Test default ctor
Test dtor
Test dtor
---------------
Test default ctor
Test dtor
Почему деструктор в первом случае вызывается дважды, а не один раз? Ведь никакого копирования, как видно из вывода, не было... Неужели компилятор вначале пытается освободить всё, что содержится "внутри указателя" - а лишь потом удаляет "обычные" объекты со стека?
Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...