链表内存管理

时间:2009-04-27 01:32:16

标签: c++ stl

我怎样才能释放包含动态分配对象的链表? 我尝试使用list<class*>列表,但后来我无法使用insert()函数将对象插入列表。有谁知道原因是什么?

8 个答案:

答案 0 :(得分:3)

当列表被删除时,

std::list<boost::shared_ptr<YourType> >将自动在列表中的每个(智能)指针上调用YourType::~YourType。如果删除一个列表元素,它将为该一个元素调用YourType::~YourType。您仍然可以拨打list.insert(new YourType

链接:www.boost.org

答案 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)

答案 6 :(得分:-2)

编辑:这是错的,抱歉

如果你正在使用std :: list,那么有一个清除函数来删除你输入的所有对象。     std :: list test;     test.clear(); 哦,和.clear()也调用了析构函数。 要使用此类列表的insert函数,您需要通过迭代器指定位置。     test.insert(test.end(),5); 但是有多个插入函数,here你可以找到更多细节

修改

有人在downvoting时发表评论吗?

答案 7 :(得分:-4)

在语言/环境中启动项目,该项目具有自动内存管理(垃圾收集)。那样的事情将是你最不关心的事情。它可以节省您将时间投入其他事情的时间。