我怎样才能释放包含动态分配对象的链表?
我尝试使用list<class*>
列表,但后来我无法使用insert()
函数将对象插入列表。有谁知道原因是什么?
答案 0 :(得分:3)
std::list<boost::shared_ptr<YourType> >
将自动在列表中的每个(智能)指针上调用YourType::~YourType
。如果删除一个列表元素,它将为该一个元素调用YourType::~YourType
。您仍然可以拨打list.insert(new YourType
)
答案 1 :(得分:2)
我如何释放包含动态分配对象的链表?
遍历列表,删除每个链接的包含对象,或者在某些情况下更好地编写删除包含对象的链接dtor。
我尝试使用列表列表,但后来我无法使用insert()函数将对象插入列表。有谁知道原因是什么?
不是没有看到你的代码。
答案 2 :(得分:1)
STL使用的解决方案是让容器拥有它包含的对象。在这种情况下,每个节点都负责在调用析构函数时释放它的对象。您仍然负责取消分配您传入的对象的副本。
如果您尝试使用stl List并遇到错误,则可能是您尝试放置的对象未实现复制构造函数。如果您尝试将除指针之外的内容粘贴到列表中,则会发生这种情况。如果您对指针感到满意,可以考虑将它们存储在容器中而不是对象本身。这将要求您在完成指针时自己调用“删除”。这通常是通过在删除节点时在节点中包含的指针上调用'delete'来实现的,或者在完成后对列表进行操作并对每个节点的内容调用'delete'来完成。
答案 3 :(得分:1)
从头到尾遍历列表,逐个删除。
答案 4 :(得分:0)
在清除列表之前,您必须迭代列表并delete
动态分配的对象。
使用新产品时 指针,请记得删除 容器之前的指针 破坏。
关于使用insert()
的问题:我不太确定您面临的问题是什么。根据解释,我假设您尝试将Class
的对象插入到列表中,其中列表包含指向Class
的指针。您能否详细说明插入问题?
用于删除动态分配对象的伪代码:
版本1:简单
list<Class*>::const_iterator iter = m_ClassList.begin();
list<Class*>::const_iterator endIter = m_ClassList.end();
for(;iter!= endIter ; ++iter)
{
delete *iter;
}
ClassList.clear();
版本2:使用for_each
的更好版本struct DeleteClassObject
{
//Functor
template<typename T>
void operator()(const T* ptr) const
{
delete ptr;
}
}
//loops through list and deletes the dynamically allocated objects using
//functor DeleteClassObject
for_each( m_ClassList.begin(), m_ClassList.end(), DeleteClassObject ());
DeleteClassObject.clear()
答案 5 :(得分:0)
您可以使用Boost中的ptr_list
http://www.boost.org/doc/libs/1_38_0/libs/ptr_container/doc/ptr_list.html
答案 6 :(得分:-2)
如果你正在使用std :: list,那么有一个清除函数来删除你输入的所有对象。 std :: list test; test.clear(); 哦,和.clear()也调用了析构函数。 要使用此类列表的insert函数,您需要通过迭代器指定位置。 test.insert(test.end(),5); 但是有多个插入函数,here你可以找到更多细节
修改
有人在downvoting时发表评论吗?
答案 7 :(得分:-4)
在语言/环境中启动项目,该项目具有自动内存管理(垃圾收集)。那样的事情将是你最不关心的事情。它可以节省您将时间投入其他事情的时间。