使用这个对象来理解:
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()。这里指针被复制到列表中(指针没有构造函数/析构函数),所以没有其他任何事情发生。该列表现在包含指向堆上对象的指针。当函数返回时,什么都不做。当列表被销毁时,它会销毁(注意destroy和delete之间的细微差别)它包含的对象(一个指针)但是一个指针没有析构函数,所以没有任何事情发生,你会泄漏内存。
所以你应该看到这样的东西:
Constructed Object: 1