Используйте этот объект, чтобы понять:
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
person
Martin York
schedule
05.02.2009