有一个类Cinema,以及它的派生词。在控制台应用程序中,我创建了这些类的列表。
auto cinemas = new std::list<Cinema*>();
cinemas->push_back(new ImaxCinema("Victory square 15/6", "Imax 1", 150, 150));
cinemas->push_back(new Cinema3D("Victory square 16/1", "3D-Cinema", "Spectrum", 14));
cinemas->push_back(new DriveInCinema("Victory square 17/89", "Drive-In", 15, 102.3));
后来,通过一个循环,我输出了内容。
for (auto iterator = cinemas->begin(); iterator != cinemas->end(); iterator++)
{
(*iterator)->write();
}
然后我清除列表并释放为列表分配的内存。
cinemas->clear();
delete cinemas;
问题:是否对列表中的每个元素都调用了delete ?如何检查?
形式上,从裸指针容器中删除元素的迂腐正确方法应该是这样的
这个想法是容器在任何时候都不应该存储无效指针。那些。首先,从容器中删除元素,然后才销毁该元素指向的对象。
从删除所有指定对象开始,然后才删除列表元素的选项实际上是可以接受的
std::list<>,但很容易导致其他类型的容器(特别是关联容器)出现问题。手动删除。
让编译器为你做这件事:
PS。它应该
cinemas是一个指针吗?不,内存没有被隐式释放。此外,在调用之后,
clear()您丢失了所有可用的指针,如果它们没有存储在其他任何地方,那么您将无法释放内存。您可以在调用之前循环释放内存
clear():您还可以使用智能指针: