Используйте этот объект, чтобы понять:
class Foo
{
public:
Foo(int x): m_x(x)
{
std::cout << "Constructed Object: " << m_x << ")\n";
}
Foo(Foo const& c): m_x(c.m_x+100)
{
std::cout << "Copied Object: " << m_x << ")\n";
}
~Foo()
{
std::cout << "Destroyed Object: " << m_x << ")\n";
}
};
Первая главная
std::list<Foo*> li;
li.push_back(Foo(1));
Здесь мы создаем временный объект Foo и вызываем push_back (). Временный объект копируется в список, а функция возвращается. По завершении этого оператора временный объект затем уничтожается (через деструктор). Когда список уничтожается, он также уничтожает все содержащиеся в нем объекты (Foo - объект с деструктором, поэтому уничтожение включает вызов деструктора).
Итак, вы должны увидеть что-то вроде этого:
Constructed Object: 1
Constructed Object: 101
DestroyedObject: 1
DestroyedObject: 101
Во втором примере у вас есть:
std::list<Foo*> li;
li.push_back(new Foo(1));
Здесь вы динамически создаете объект в куче. Затем вызовите push_back (). Здесь указатель копируется в список (указатель не имеет конструктора / деструктора), поэтому больше ничего не происходит. Список теперь содержит указатель на объект в куче. Когда функция возвращает, больше ничего не делается. Когда список уничтожается, он уничтожает (обратите внимание на тонкую разницу между уничтожением и удалением) объект, который он содержит (указатель), но указатель не имеет деструктора, поэтому ничего не происходит, вы потеряете память.
Так что вы должны увидеть что-то вроде этого:
Constructed Object: 1