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
Почему деструктор в первом случае вызывается дважды, а не один раз? Ведь никакого копирования, как видно из вывода, не было... Неужели компилятор вначале пытается освободить всё, что содержится "внутри указателя" - а лишь потом удаляет "обычные" объекты со стека?